HTML Agility PackとLinqを使ってhtmlを解析する

c# html-agility-pack html-parsing linq

質問

私は次のHTMLを持っています

(..)
<tbody>
 <tr>
  <td class="name"> Test1 </td>
  <td class="data"> Data </td>
  <td class="data2"> Data 2 </td>
 </tr>
 <tr>
  <td class="name"> Test2 </td>
  <td class="data"> Data2 </td>
  <td class="data2"> Data 2 </td>
 </tr>
</tbody>
(..)

私が持っている情報は、名前=>だから "Test1"& "Test2"です。私が知りたいことは、私が持っている名前に基づいて、どのように "データ"と "データ2"にあるデータを得ることができるかです。

現在私は使用しています:

var data =
    from
        tr in doc.DocumentNode.Descendants("tr")
    from   
        td in tr.ChildNodes.Where(x => x.Attributes["class"].Value == "name")
    where
        td.InnerText == "Test1"
    select tr;

しかし、私は得る{"Object reference not set to an instance of an object."}私は見しようとすると、 data

受け入れられた回答

あなたの試みは、あなたのコードに2つの問題があります:

  1. ChildNodesは奇妙です - class属性を持たない空白テキストノードも返します(もちろん、属性は持てません)。
  2. James Walfordがコメントしたように、テキストの周りのスペースは重要なので、おそらくトリムする必要があります。

これらの2つの修正によって、次の作業が行われます。

var data =
      from tr in doc.DocumentNode.Descendants("tr")
      from td in tr.Descendants("td").Where(x => x.Attributes["class"].Value == "name")
     where td.InnerText.Trim() == "Test1"
    select tr;

人気のある回答

ここでXPATHの方法です - うーん...誰もがXPATHのパワーを忘れてしまって、C#XLinqだけに集中しているようです。

この関数は、名前に関連付けられたすべてのデータ値を取得します。

public static IEnumerable<string> GetData(HtmlDocument document, string name)
{
    return from HtmlNode node in
        document.DocumentNode.SelectNodes("//td[@class='name' and contains(text(), '" + name + "')]/following-sibling::td")
        select node.InnerText.Trim();
}

たとえば、このコードはすべての 'Test2'データをダンプします。

    HtmlDocument doc = new HtmlDocument();
    doc.Load(yourHtml);

    foreach (string data in GetData(doc, "Test2"))
    {
        Console.WriteLine(data);
    }



ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ