2011-07-27 60 views
2

这就是我想要的解析解析内部HTML

<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']"); 

这是罚款和回报,S我所有的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

回答

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选择器将选择具有href属性,该属性是与一类'photoBox pB-ms'一个div元素的子节点的所有a元素。然后,您可以迭代该集合并获取每个元素的属性值。

而且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

不是XML的解析,您可以使用HTMLAgilePack

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

什么?然而,他不正确地使用HTML _Agility_ Pack ......。 –

+0

@Jeff:你能告诉我有什么问题吗? – Peyman

+0

不要误解我的意思,你的代码很好。这只是表明他在使用XML解析器。但他实际上正在使用HTML Agility Pack。他的XPath不正确,就这些。 –