Выберите все ссылки из таблицы Html, используя XPath (и HtmlAgilityPack)

c# html-agility-pack xpath

Вопрос

Я пытаюсь извлечь все ссылки с атрибутом href, который начинается с http: //, https: // или /. Эти ссылки лежат внутри таблицы (tbody> tr> td и т. Д.) С определенным классом. Я думал, что могу указать только элемент a без всего пути к нему, но он, похоже, не работает. Я получаю исключение NullReferenceException в строке, которая выбирает ссылки:

var table = doc.DocumentNode.SelectSingleNode("//table[@class='containerTable']");
if (table != null)
{
    foreach (HtmlNode item in table.SelectNodes("a[starts-with(@href, 'https://')]"))
    {
        //not working

Я не знаю о каких-либо рекомендациях или рекомендациях, когда дело доходит до XPath. Я создаю накладные расходы, когда я дважды запрашиваю документ?

Принятый ответ

Использование :

 //tbody/descendant::a[starts-with(@href,'https://')
                     or
                       starts-with(@href,'http://')
                     or
                       starts-with(@href,'./') 
                      ]

У вас все еще будет проблема , если вы не исправите свой код, чтобы отразить тот факт, что метод экземпляра XmlNode.SelectNodes() имеет тип возврата XmlNodeList , а не HtmlNode .


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

Проблемы в том, что вы выбираете таблицу, а затем сразу же пытаетесь выбрать якоря, как если бы они были прямыми децидентами. В середине есть теги tr и td .

Итак, если вы измените свой xpath на следующее, все должно работать:

"tbody/tr/td/a[starts-with(@href, 'https://')]"

Это не сработает, если ваши якоря завернуты в что-то еще, поэтому вы можете выбрать все привязки в текущем наборе узлов (например, таблицу):

"//a[starts-with(@href, 'https://')]"

См. Это более подробно о синтаксисе xpath.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему