内部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です

しかし、私は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() };

誰も私にこのAHrefを取得するためのXPathやクエリの書き方を教えてくれますか?

受け入れられた回答

これは動作します(テスト済み):

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

問題は、属性と要素セレクタが混在していたことです。また、あなたが本当にコレクションを照会しようとしているかどうかは不明です。

上のXPathセレクタは、 'photoBox pB-ms'クラスを持つdiv要素の子ノードであるhref属性を持つすべてa要素を選択します。このコレクションを反復し、各要素の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();

人気のある回答

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
}


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow