html agility packは、trの次のtrのtdのinnertextを取得します。

c# html-agility-pack xpath

質問

私はhtmlの敏捷性パックにいくつかの問題を抱えています。同じクラス= "関連ニュース"を1つまたは複数のテーブルに繰り返してランダムに生成しましたが、必ずしも互いに従っているわけではなく、ほとんどの場合、それらの間のクラスはありません。私がしようとしているのは、クラスのないそれらのtrのtdのinnerTextを取得し、それらのすぐ上にあるtr class = "related-news"

これはhtmlです

<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>

どのようなクラスのないtrがどれくらいのレベルの "related-news"でtrとgerenatedされるかを知る方法はありません。私はすべてのtdsの内部テキストを取得する必要があり、問題は毎回それらを分離することであるという約束はありません私はクラス "関連ニュース"でtrに到達します

このようなもの:

このtrが "related-news"というクラスを持っていれば、このtrのintertextとnext trのinnertextを取得しますが、 "related-news"クラスのtrがあればclass "related-news"持続する

これはhtmlのアジリティパックでも可能ですか?

私はこのコードですべてのTDの文章を取得します:

<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>
<tr class="related-news">
   <td>some text</td>
   <td>some text</td>
   <td>some text</td>
</tr>

私はどのようにコンディションを続けるか、追加するか分からない

人気のある回答

これは、非常に一般的な操作の兆候に過ぎません。逐次リストを通って物事を組み合わせることです。

基本的な考え方は、 "関連ニュース"ノードだけでなく、 すべて<tr>ノードを取得することです。次に、リストを通ってそれらをグループ化します。下の擬似コードは、それがどのように行われたかを示しています。

List<string> TextLines = new List<string>();
StringBuilder sb = new StringBuilder();
foreach (var node in nodes)
{
    if node class == "related-news"
    {
        // we've found a new "related-news" node.
        // add the previous stuff to the list
        if (sb.Length > 0)
            TextLines.Add(sb.ToString());
        sb = new StringBuilder(node.InnerText);
    }
    else
    {
        sb.Append(node.InnerText);
    }
}
// and don't forget the last one
if (sb.Length > 0)
    TextLines.Add(sb.ToString());

このコードでは、クラス "related-news"を持つ<tr>タグとそうでないタグについてのみ気にしています。別のグループに分類したいクラスがある場合は、コードを変更する必要があります。




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