解析内部HTML
问题描述:
这就是我想要的解析解析内部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
答
这作品(测试):
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();
答
不是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
}
什么?然而,他不正确地使用HTML _Agility_ Pack ......。 –
@Jeff:你能告诉我有什么问题吗? – Peyman
不要误解我的意思,你的代码很好。这只是表明他在使用XML解析器。但他实际上正在使用HTML Agility Pack。他的XPath不正确,就这些。 –