HtmlAgilityPack C # --- Selectnodes Всегда возвращает Null

c# html-agility-pack html-parsing xpath

Вопрос

Это текст xpath, который я пытался использовать вместе с парсером HtmlAgilityPack C #.

//div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt']

Я попытался оценить выражение xpath с помощью firefox xpath add = on и успешно получил требуемые элементы. Но код c # возвращает исключение Null.

HtmlAgilityPack.HtmlNodeCollection node = htmldoc.DocumentNode.SelectNodes("//div[@id ='sc1']/table/tbody/tr/td/span[@class='blacktxt']");            
MessageBox.Show(node.ToString());

узел всегда содержит нулевое значение ... Пожалуйста, помогите мне найти способ обойти эту проблему ... Спасибо ..

Популярные ответы

DOM Требуется <tbody/> Тэги, которые нужно вставить

Все распространенные расширения браузера для построения выражений XPath работают над DOM. В отличие от спецификаций HTML, спецификации DOM требуют, чтобы элементы <tr/> находились внутри элементов <tbody/> , поэтому браузеры добавляют такие элементы, если они отсутствуют. Вы можете легко увидеть разницу, если посмотреть на источник HTML, используя Firebug (или аналогичные инструменты разработчика, работающие на DOM), и отображать источник страницы (используя wget или аналогичные инструменты, которые не интерпретируют ничего, если необходимо).

Решение

Удалите шаг оси /tbody , и ваше выражение XPath, вероятно, сработает.

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt']

Если вам нужно поддерживать как HTML с, так и без <tbody/> Tags

Для более общего решения вы могли бы заменить шаг оси /tbody шагом децентрализованного или самого себя // , но это могло бы перейти в «внутренние таблицы»:

//div[@id = 'sc1']/table//tr/td/span[@class='blacktxt']

Лучше было бы использовать альтернативные выражения XPath:

//div[@id = 'sc1']/table/tr/td/span[@class='blacktxt'] | //div[@id = 'sc1']/table/tbody/tr/td/span[@class='blacktxt'] 

Простое решение XPath 2.0 будет

//div[@id = 'sc1']/table/(tbody, self::*)/tr/td/span[@class='blacktxt']


Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow