Выберите все ссылки из таблицы Html, используя XPath (и HtmlAgilityPack) - PullRequest
3 голосов
/ 21 марта 2010

Я пытаюсь извлечь все ссылки с атрибутом 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. Могу ли я создать накладные расходы при запросе документа два раза?

Ответы [ 2 ]

3 голосов
/ 21 марта 2010

Используйте

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

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

2 голосов
/ 21 марта 2010

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

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

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

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

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

См. this для более подробной информации о синтаксисе xpath.

...