Выражение XPath не работает в HtmlAgilityPack - PullRequest
3 голосов
/ 28 августа 2010

Я знаю, что это может быть моей глупостью в XPath, но позвольте мне спросить, чтобы убедиться, потому что я достаточно гуглил.

У меня есть веб-сайт и я хочу получить заголовки новостей от него: www.farsnews.com (это персидский язык)

Использование расширений FireBug и FireXpath под firefox, и я вручную извлекаю и проверяю несколько выражений Xpath, соответствующих заголовкам, таких как:

* html/body/div[2]/div[2]/div[2]/div[*]/div[2]/a/div[2]
* .//*[@class="topnewsinfotitle "]
* .//div[@class="topnewsinfotitle "]

Я такжепроверил их, используя расширение XPather, и они, кажется, работают довольно хорошо, но когда я их протестирую ... SelectNodes возвращает ноль!

Любая подсказка или подсказка?

вот кусоккод:

listBox2.ResetText();

HtmlAgilityPack.HtmlWeb w = new HtmlAgilityPack.HtmlWeb();
HtmlAgilityPack.HtmlDocument doc = w.Load("http://www.farsnews.com");
HtmlAgilityPack.HtmlNodeCollection nc = doc.DocumentNode.SelectNodes(".//div[@class=\"topnewsinfotitle \"]");

listBox2.Items.Add(nc.Count+" Items selected!");

foreach (HtmlAgilityPack.HtmlNode node in nc) {
            listBox2.Items.Add(node.InnerText);
        }

Спасибо.

1 Ответ

4 голосов
/ 01 сентября 2010

Я проверил ваши выражения.И, как упоминал Диалектик в комментарии, у вас есть конечный пробел, которого там не должно быть.

//div[@class='topnewsinfotitle ']/text()

Возвращает «пустую последовательность», см. Оценку: http://xmltools.dk/EQA-ACA6

//div[@class='topnewsinfotitle']/text()

Возвращает список ваших заголовков, см .: http://xmltools.dk/EgA2APAj

Однако, если могут быть другие классы, вы используете это (http://xmltools.dk/EwA8AJAW):

//div[contains(@class, 'topnewsinfotitle')]/text()

(я вижуони являются проблемой кодирования в предоставленных мною ссылках, однако для значения и для всех выражений XPath это не должно иметь значения, вы можете удалить /text(), чтобы получить узлы вместо только текста)

НО, если вы владеете этим сайтом, вы должны предоставить заголовки с XML (возможно, RSS или ATOM) или JSON, которые будут иметь более высокую производительность и, что наиболее важно, будут более пуленепробиваемыми.

...