HTMLAgilityPack选择从第一次迭代到div的节点

时间:2015-09-29 17:18:21

标签: c# html-agility-pack

我尝试使用HTMLAgilityPack首次解析某些网站。一切都按预期工作,但仅适用于第一次迭代。在每次迭代中,我都会获得带有数据的唯一div,但SelectNodes()始终从第一次迭代中获取数据。 下面列出的代码解释了问题

工作站的所有属性都从第一次迭代中获取值。

  static void Main(string[] args)
    {
        List<Station> stations = new List<Station>();

        wClient = new WebClient();
        wClient.Proxy = null;
        wClient.Encoding = encode;

        for (int i = 1; i <= 1; i++)
        {
            HtmlDocument html = new HtmlDocument();
            string link = string.Format("http://energybase.ru/powerPlant/index?PowerPlant_page={0}&pageSize=20&q=/powerPlant", i);
            html.LoadHtml(wClient.DownloadString(link));
            var stationList = html.DocumentNode.SelectNodes("//div[@class='items']").First().ChildNodes.Where(x=>x.Name=="div").ToList();//get list of nodes with PowerStation Data
            foreach (var item in stationList) //each iteration returns Item with unique InnerHTML
            {
                Station st = new Station();

                st.Name = item.SelectNodes("//div[@class='col-md-20']").First().SelectNodes("//div[@class='name']").First().ChildNodes["a"].InnerText;//gets name from first iteration
                st.Url = item.SelectNodes("//div[@class='col-md-20']").First().SelectNodes("//div[@class='name']").First().ChildNodes["a"].Attributes["href"].Value;//gets url from first iteration and so on
                st.Company = item.SelectNodes("//div[@class='col-md-20']").First().SelectNodes("//div[@class='name']").First().ChildNodes["small"].ChildNodes["em"].ChildNodes["a"].InnerText;

                stations.Add(st);
            }

        }

也许我没有得到OOP的一些必需品?

2 个答案:

答案 0 :(得分:4)

使用XPath的全部功能可以大大简化您的代码。

var stationList = html.DocumentNode.SelectNodes("//div[@class='items']/div");
// XPath-expression may be so:                  "//div[@class='items'][1]/div"
// where [1] means first node

foreach (var item in stationList)
{
    Station st = new Station();

    st.Name = item.SelectSingleNode("div[@class='col-md-20']/div[@class='name']/a").InnerText;

    st.Url = item.SelectSingleNode("div[@class='col-md-20']/div[@class='name']/a").Attributes["href"].Value;

    string rawText = item.SelectSingleNode("div[@class='col-md-20']/div[@class='name']/small/em").InnerText;
    st.Company = HttpUtility.HtmlDecode(rawText.Trim());

    stations.Add(st);
}

您的错误是使用XPath descendants轴://div

更好的重写代码如下:

var divName = item.SelectSingleNode("div[@class='col-md-20']/div[@class='name']");
var nodeA = divName.SelectSingleNode("a");

st.Name = nodeA.InnerText;
st.Url = nodeA.Attributes["href"].Value;

string rawText = divName.SelectSingleNode("small/em").InnerText;
st.Company = HttpUtility.HtmlDecode(rawText.Trim());

答案 1 :(得分:1)

这个article在html敏捷包的各个方面都有一些很好的例子。

看看这篇文章,它会给你一个快速的开始。