解析内部HTML

时间:2011-07-27 02:48:57

标签: c# html-parsing html-agility-pack

这就是我要解析的内容

<div class="photoBox pB-ms">
<a href="/user_details?userid=ePDZ9HuMGWR7vs3kLfj3Gg">
<img width="100" height="100" alt="Photo of Debbie K." src="http://s3-media2.px.yelpcdn.com/photo/xZab5rpdueTCJJuUiBlauA/ms.jpg">
</a>
</div>

我正在使用以下XPath来找到它

HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms']");

这很好并且返回,我的所有div,s与photobox类

但是当我想使用

获得ahref时
HtmlNodeCollection bodyNode = htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms'//a href]");

我收到错误无效令牌。

我也尝试使用查询

   var lowestreview =
  from main in htmlDoc.DocumentNode.SelectNodes("//div[@class='photoBox pB-ms']") 
   from rating in main.SelectNodes("//a href")
  select new { Main=main.Attributes[0].Value,AHref = rating.ToString() };

有人会告诉我如何编写XPath或查询来获取此AHref

2 个答案:

答案 0 :(得分:3)

这有效(经过测试):

HtmlNodeCollection bodyNodes = htmlDoc.DocumentNode
                                      .SelectNodes("//div[@class='photoBox pB-ms']/a[@href]");
foreach(var node in bodyNodes)
{
    string href = node.Attributes["href"].Value;
}

问题是您将属性和元素选择器混淆了。另外,您也不清楚是否真的打算查询集合

上面的XPath选择器将选择具有a属性的所有href元素,这些元素是div元素的子节点,类为'photoBox pB-ms'。然后,您可以迭代此集合并获取每个元素的href属性值。

此外,HtmlAgilityPack现在支持Linq(从1.4开始),因此只需获取特定属性值就可以更容易(imo):

string hrefValue = htmlDoc.DocumentNode
                          .Descendants("div")
                          .Where(x => x.Attributes["class"].Value == "photoBox pB-ms")
                          .Select(x => x.Element("a").Attributes["href"].Value)
                          .FirstOrDefault();

答案 1 :(得分:1)

您可以使用HTMLAgilePack

代替XML解析
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml([HTML Text]);
foreach(HtmlNode link in doc.DocumentElement.SelectNodes("//a[@href"])
{
    HtmlAttribute att = link["href"];
    // att.Value
}