LINQでHTMLを解析する

c# html html-agility-pack linq

質問

私は、HTMLのアジリティパックとLINQを使用してHTMLテーブルからすべてのセルを取得しようとしています。 HTMLソースをHtmlAgilityPack.HtmlDocumentに読み込み、LINQでタグを選択しました。しかし、foreachを使用して結果を反復すると、2番目のレコードでクラッシュします。

これはHTMLソースの断片です:

<tr>
    <td class='city'>New York</td>
    <td>Card 1</td>
</tr>
<tr>
    <td class='city'>London</td>
    <td>Card 2</td>
</tr>
<tr>
    <td class='city'>Tokyo</td>
    <td>Card 3</td>
</tr>
<tr>
    <td class='city'>Berlin</td>
    <td>Card 4</td>
</tr>

これは私が作ったものです:

htmlDoc.LoadHtml(await msgRecived.Content.ReadAsStringAsync());

var tds=
    from td in htmlDoc.DocumentNode.Descendants("td")
    where td.Attributes["class"].Value == "city"
    select td.InnerText;

foreach (var td in tds)
{
    citiesText = citiesText + " " + td;
}

foreachを使う代わりに、最初の要素だけを返します。

citiesText = tds.ElementAt(0);

それはニューヨークを返しますが、ElementAt(1)を試してみると、 オブジェクト参照オブジェクトのインスタンスに設定されていないとクラッシュします。

どんな助け?ありがとう

受け入れられた回答

Attributes["class"]nullでないことを確認する必要がありnull

var tds =
    from td in doc.DocumentNode.Descendants("td")
    where td.Attributes["class"] != null && td.Attributes["class"].Value == "city"
    select td.InnerText;

検索された2番目の<td>class属性がないため、その場合にAttributes["class"]にアクセスするとnull返されます。 null .Valueを呼び出すと例外が発生しています。

代わりにGetAttributeValue使用GetAttributeValueこともできます:

var tds =
    from td in doc.DocumentNode.Descendants("td")
    where td.GetAttributeValue("class", null) == "city"
    select td.InnerText;

人気のある回答

ちょうど推測ですが、おそらく最初の要素のtdを見ているだけです。多分あなたは必要です

代わりにhtmlDoc.DocumentNode.Descendants( "table")。



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