解析內部HTML

c# html-agility-pack html-parsing

這就是我要解析的內容

<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

一般承認的答案

這工作(測試):

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();

熱門答案

您可以使用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
}


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow