Problèmes avec HtmlAgilityPack

c# html-agility-pack

Question

Je maîtrise HtmlAgilityPack. J'essaie d'obtenir des données à partir d'une page pré-chargée. A savoir: Il y a une page 1.htm. Je veux obtenir la valeur de la table en face de la ligne "Système d'exploitation". (le document lui-même est attaché). Je fais ça:

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]");
            ...

En général, il est nécessaire d'extraire beaucoup d'informations du fichier, mais je pense que si une ligne est obtenue, alors plus loin par analogie.

La ligne requise était la suivante:

 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;
            }

Mais cette option est "sur le front". Si vous ne modifiez pas la structure de mon document. Et comment il est possible avec l'aide de la recherche n'a pas encore compris.

Fichier

Réponse acceptée

Cela retournera un dictionnaire de tables par nom. Chaque table est un dictionnaire avec la première colonne comme clé et la seconde comme valeur.

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);

}

Par exemple, les tables["power management"] renvoient 4 entrées:

  • [0] {[Ð ¢ ÐμÐºÑƒÑ ‰ ий Ð¸Ñ Ñ,Ð¾Ñ ‡ ник пиÑ,Ð ° ниÑ, Dd »ÐμкÑ,Ñ € Ð¾Ñ ÐμÑ,ÑŒ]} System.Collections. Generic.KeyValuePair
  • [1] {[¡Ð¾Ñ Ñ‚Ð¾Ñ Ð½Ð¸Ðµ Ð ± Ñ ° Ñ‚ ° Ñ € е¹, ÐÐÐÐ System System System System System System.Collections.Generic.Generic.KeyValuePair
  • [2] {[»Ð½Ð¾Ðµ Ð²Ñ € ÐµÐ¼Ñ € Ð ° Ð ± Ñ‚Ñ‹ Ñ Ð¾ ± ° Ñ‚ ° Ñ € е¹, еиР· ²ÐµÑ тно]} System.Collections. Generic.KeyValuePair
  • [3] {[žÑ Ñ‚ ° вшеµÑÑ ÐÑ € е¼ÑÑÑ € Ð ° ± ÑÑ‚Ñ ‹ÑÐ System.Collections.Generic.KeyValuePair

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

"» ÐµÐºÑ‚Ñ € Ð¾Ñ ÐµÑ‚ÑŒ "

Pour itérer, vous pouvez faire:

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);
    }
}


Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi