Probleme mit HtmlAgilityPack

c# html-agility-pack

Frage

Ich beherrsche HtmlAgilityPack. Ich versuche Daten von einer vorinstallierten Seite zu erhalten. Nämlich: Es gibt eine Seite 1.htm. Ich möchte den Wert aus der Tabelle gegenüber der Zeile "Betriebssystem" erhalten. (Das Dokument selbst ist beigefügt). Ich mache das:

private void simpleButton1_Click(object sender, EventArgs e)
        {
            // Создаю экземпляр класса
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            // Загружаю файл
            doc.Load(@"D:\(тут путь к файлу)\1.htm");
            // Пытаюсь получить информацию из ноды, но получаю null
            HtmlAgilityPack.HtmlNode bodyNode = doc.DocumentNode.SelectSingleNode("//TD[@CLASS=pt]");
            ...

Im Allgemeinen ist es notwendig, viele Informationen aus der Datei zu extrahieren, aber ich denke, wenn eine Zeile erhalten wird, dann weiter analog.

Die erforderliche Zeile war wie folgt:

 private void simpleButton1_Click(object sender, EventArgs e)
        {
            // Создаю экземпляр класса
            HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
            // Загружаю файл
            doc.Load(@"D:\(тут путь к файлу)\1.htm");

            foreach (HtmlAgilityPack.HtmlNode node in doc.DocumentNode.SelectNodes("//body/table[2]/tr[8]/td[4]"))
            {
                string stroka = node.InnerText;
            }

Aber diese Option ist "auf der Stirn". Wenn Sie die Struktur meines Dokuments nicht ändern. Und wie es mit Hilfe der Suche möglich ist, ist noch nicht bekannt.

Datei

Akzeptierte Antwort

Dies wird ein Wörterbuch mit Tabellen nach Namen zurückgeben. Jede Tabelle ist ein Wörterbuch mit der ersten Spalte als Schlüssel und der zweiten als Wert.

var tables = new Dictionary<string, Dictionary<string, string>>();
var doc = new HtmlDocument();
doc.Load(@"D:\(тут путь к файлу)\1.htm", Encoding.GetEncoding(1251), false);
var tableNames = doc.DocumentNode.SelectNodes("//td[@class='pt']/a").Select(a=>a.Attributes["name"].Value);
foreach(string name in tableNames)
{
    var table = doc.DocumentNode.SelectSingleNode("//table[.//a[@name='" + name + "']]/following-sibling::table[1]");
    int columns = table.SelectNodes(".//tr[1]/td").Count();

    string[] keys = table.SelectNodes(".//tr/td["+(columns-1)+"]").Select(n => n.InnerText.Replace("&nbsp;"," ").Trim()).ToArray();
    string[] values = table.SelectNodes(".//tr/td["+columns+"]").Select(n => n.InnerText.Replace("&nbsp;"," ").Trim()).ToArray();
    var body = new Dictionary<string, string>();
    for (int i = 0; i < keys.Count(); i++)
    {
        string key = keys[i];
        if (body.ContainsKey(key))
            body[key] += ", " + values[i];
        else if( key!="" && values[i]!="")
            body[key] = values[i];

    }
    tables.Add(name, body);

}

Zum Beispiel gibt tables["power management"] 4 Einträge zurück:

  • [0] {[Ð Ð ÐμкÑ,Ñ Ñ Ñ Ð Ð ÑÑÑÑÑÑÑÑÑÑÑÑ ÑÑÑ Ð Ð½Ð¸Ð¸Ð¸Ð¸Ð¸Ð¸Ð¸Ñ,Ñ Ð Ð½Ð¸ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑнÑ,Ñ,Ñ,,,,,}} System.Collections. Generic.KeyValuePair
  • [1] {[о ¸½¸,,,,,,,,,,,,,,,,,}}}}}}}}}}}}}}}}}}} System.Collections.Generic.KeyValuePair
  • [2] {[Ÿ ¾ Ð Ð Ð Ð,,,,,,,,, Ð Ð Ð Ð Ð Ð Ð Ð Ð Ð}}}}}}}}}}} System System System System System System System System System System System System System System System. Generic.KeyValuePair
  • [3] {[žÑ вÐÑÑÑÑ,,,,,,,,,,,,,}}}}}}}}}}}}}}}}}}}}}}}}}}} System.Collections.Generic.KeyValuePair

und tables["power management"]["Текущий Ð¸Ñ Ñ‚Ð¾Ñ‡Ð½Ð¸Ðº Ð¿Ð¸Ñ‚Ð°Ð½Ð¸Ñ "]

"Ð ÐμкÑÑÑÑÑÑÑÑÑÑÑÑÑÑ"

Zum Iterieren können Sie Folgendes tun:

foreach(var tableName in tables.Keys)
{
    var table = tables[tableName];
    foreach(var key in table.Keys)
    {
        string value = table[key];
        Debug.Print(tableName + "/" + key + "/" + value);
    }
}


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum