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.
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(" "," ").Trim()).ToArray();
string[] values = table.SelectNodes(".//tr/td["+columns+"]").Select(n => n.InnerText.Replace(" "," ").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);
}
}