1

[この質問には、HTMLAgilityPack と XPath を使用した選択的なスクリーン スクレイピングに住んでいる親戚がいます]

次のような一般的な外観を持つ、解析する HTML がいくつかあります。

...
<tr>
<td><a href="" title="">Text Data here (1)</a></td>
<td>Text Data here(2)</td>
<td>Text Data here(3)</td>
<td>Text Data here(4)</td>
<td>Text Data here(5)</td>
<td>Text Data here(6)</td>
<td><a href="link here {1}" class="image"><img alt="" src="" /></a></td>
</tr>
<tr>
<td><a href="" title="">Text Data here (1)</a></td>
<td>Text Data here(2)</td>
<td>Text Data here(3)</td>
<td>Text Data here(4)</td>
<td>Text Data here(5)</td>
<td>Text Data here(6)</td>
<td><a href="link here {1}" class="image"><img alt="" src="" /></a></td>
</tr>
...

次のような意味のあるチャンクで解析できる方法を探しています。

(1)、(2)、(3)、(4)、(5)、(6)、{1} CRLF
(1)、(2)、(3)、(4)、(5)、(6) 、{1}CRLF
など

私は2つの方法を試しました:
方法1:

var dataList = currentDoc.DocumentNode.Descendants("tr")
                .Select
                 (
                  tr => tr.Descendants("td").Select(td => td.InnerText).ToList()
                 ).ToList();

これは s の内部テキストをtd取得しますが、リンク {1} の取得に失敗します。ここでは、多数のリストを含むリストが作成されます。ネストされた foreach を使用して管理できます。

方法 2:

var dataList = currentDoc.DocumentNode
               .SelectNodes("//tr//td//text()|//tr//td//a//@href");

リンク {1} とすべてのデータは取得できますが、整理されていません。ここでは、すべてのデータが大きなチャンクで存在します。一方のデータtrは相対的であるため、その関係を失います。

では、どうすればこの問題を解決できますか?

4

1 に答える 1

0

Following query selects a element with non-empty href attribute from each cell. If there is no such element, then inner text of cell is used:

var dataList = 
     currentDoc.DocumentNode.Descendants("tr")
               .Select(tr => from td in tr.Descendants("td")
                             let a = td.SelectSingleNode("a[@href!='']")
                             select a == null ? td.InnerText : 
                                                a.Attributes["href"].Value);

Feel free to add ToList() calls.

于 2013-03-14T09:12:24.283 に答える