HTMLアジリティパックとLINQ

c# html-agility-pack linq web-scraping

質問

私はHAPを使ってウェブサイトのテーブルからデータを抜き取り、行をループして、あらかじめ定義された文字列と一致する列の値を見つけ出し、一致する行だけを保存したいと考えています。次に、列見出しをキーにして、選択した行の列テキストを値として持つ辞書を作成します。

表例。

<table id="Table3">
<tbody><tr><td></td></tr>
<tr>
<td>ID</td>
<td>Last Name</td>
<td>First Name</td>
<td>Birth Date</td>
<td>Relation</td>
</tr>

<tr>
<td>nbsp;01&nbsp;</td>
<td>&nbsp;DUNN          &nbsp;</td>
<td>&nbsp;JOE          &nbsp;</td>
<td>&nbsp;19931209&nbsp;</font></td>
<td>&nbsp;Son&nbsp;</td>
</tr>

<tr>
<td>nbsp;02&nbsp;</td>
<td>&nbsp;SMITH          &nbsp;</td>
<td>&nbsp;MARY          &nbsp;</td>
<td>&nbsp;19950206&nbsp;</font></td>
<td>&nbsp;Daughter&nbsp;</td>
</tr>

<tr>
<td>nbsp;03&nbsp;</td>
<td>&nbsp;ROCKFORD          &nbsp;</td>
<td>&nbsp;BILL          &nbsp;</td>
<td>&nbsp;20000320&nbsp;</font></td>
<td>&nbsp;Son&nbsp;</td>
</tr>

</tbody></table>

私が見たいDOBの日付が20000320であれば、Billのすべての情報が必要です。

ヘッダータイトルをリストに追加することは問題ありません。私はユーザーの行が正しく書かれていないことを知っている。私が持っているものは、まだ1行の代わりに行のリストを取得しようとしています。私がユーザー行で実行しているもう一つの問題は、内部のテキストが "&nbsp"で戻ってくるだけで、スペースを取り除く方法が必要なので、私は.Replaceを行うことができません。私はすべての提案に開放されています。このすべてを行うなど、よりスマートな方法

List<string> headerList = new List<string>();
List<string> userList = new List<string>();

var htmlRows = htmlDoc.DocumentNode.SelectNodes("//*[@id=\"Table3\"]/tbody/tr");
if(htmlRows != null)
{
     // Add first row which contains column headings
     htmlRows[2]
         .Elements("td")
         .Select(td => td.InnerText.Trim())
         .ToList()
         .ForEach(header => headerList.Add(header));

     // Add user rows
     htmlRows
         .Skip(3)
         .Select(tr => tr.Elements("td")
             .Where(td => td.InnerText.Trim() == dteDOB))
             .ToList()
         .ForEach(row => userList.Add(row));

    for(int i = 0; i < headerList.Count; i++)
    {
        if(headerList.Count == userList.Count && userList[i] != null)
            dictValues.Add(headerList[i], userList[i]);                 
    }
}

受け入れられた回答

あなたは私が思うtdの値を使って全体のtrを選択しようとすることができます

//*[@id=\"Table3\"]/tbody/tr[td//text()[contains(., 'targetString')]]

これをみて

指定されたテキストを含むセルを持つテーブル行を選択するXPath



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