使用htmlAgilityPack和XPath进行屏幕抓取

时间:2013-03-14 08:47:59

标签: c# xpath html-agility-pack

[这个问题的亲属住在:Selective screen scraping with HTMLAgilityPack and 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
等等

我尝试了两种方法:
方式1:

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

它会提取td的内部文本,但无法获取链接{1}。在这里,创建一个包含大量列表的列表。我可以使用嵌套的foreach来管理它。

方式2:

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

它确实为我提供了链接{1}和所有数据,但它变得无组织。在这里,所有数据都存在于大块中。因为,tr中的数据是相对的,我现在松开了这种关系。

那么,我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

以下查询从每个单元格中选择具有非空a属性的href元素。如果没有这样的元素,则使用单元格的内部文本:

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);

随意添加ToList()来电。

相关问题