Проблемы с HtmlAgilityPack - PullRequest
       12

Проблемы с HtmlAgilityPack

0 голосов
/ 28 января 2012

Я не могу понять, что идет не так. я просто создаю проект для проверки HtmlAgilityPack и того, что у меня есть.

using System;
using System.Collections.Generic;
using System.Text;
using HtmlAgilityPack;


namespace parseHabra
{
    class Program
    {
        static void Main(string[] args)
        {
            HTTP net = new HTTP(); //some http wraper
            string result = net.MakeRequest("http://stackoverflow.com/", null);
            HtmlDocument doc = new HtmlDocument();
            doc.LoadHtml(result);

            //Get all summary blocks
            HtmlNodeCollection news = doc.DocumentNode.SelectNodes("//div[@class=\"summary\"]");
            foreach (HtmlNode item in news)
            {
                string title = String.Empty;
                //trouble is here for each element item i get the same value
                //all the time
                title = item.SelectSingleNode("//a[@class=\"question-hyperlink\"]").InnerText.Trim();
                Console.WriteLine(title);
            }
            Console.ReadLine();
        }
    }
}

Похоже, я делаю xpath не для каждого выбранного узла, а для всего документа. Есть предложения, почему это так? Спасибо заранее.

Ответы [ 2 ]

2 голосов
/ 28 января 2012

Я не пробовал ваш код, но из-за быстрого просмотра я подозреваю, что проблема в том, что // выполняет поиск в корне всего документа, а не в корне текущего элемента, как я предполагаю, вы ожидаете.1002 *

Попробуйте поставить . перед //

".//a[@class=\"question-hyperlink\"]"
1 голос
/ 28 января 2012

Я бы переписал ваш xpath одним запросом, чтобы найти все заголовки вопросов, вместо того, чтобы найти резюме , а затем заголовков.Ответ Криса указывает на проблему, которую можно было легко избежать.

var web = new HtmlWeb();
var doc = web.Load("http://stackoverflow.com");

var xpath = "//div[starts-with(@id,'question-summary-')]//a[@class='question-hyperlink']";

var questionTitles = doc.DocumentNode
    .SelectNodes(xpath)
    .Select(a => a.InnerText.Trim());
...