使用htmllagilitypack和XPath选择性抓取屏幕
本文关键字:抓取 屏幕 选择性 XPath htmllagilitypack 使用 | 更新日期: 2023-09-27 18:03:45
[这个问题与使用htmllagilitypack和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>
...
我正在寻找一种方法,我可以解析它在有意义的块,但我想有选择性的数据,如前两个td数据和最后两个td数据:
(1), (2), (6), {1} CRLF
(1), (2), (6), {1} CRLF
等等
我试过两种方法:方法1:
var dataList = currentDoc.DocumentNode.Descendants("tr")
.Select
(
tr => tr.Descendants("td").Select(td => td.InnerText).ToList()
).ToList();
获取tds的内部文本,但无法获取链接{1}。在这里,创建了一个包含许多列表的列表。我可以使用嵌套的foreach来管理它。
方式2:
var dataList = currentDoc.DocumentNode
.SelectNodes("//tr//td//text()|//tr//td//a//@href");
确实得到了链接{1}和所有数据,但它变得无组织。在这里,所有的数据都以大块的形式呈现。因为一个tr中的数据是相对的,所以我现在失去了这种关系。
那么,我如何才能获得我感兴趣的数据,只有前两列和最后两列的数据呢?
以下代码将选择前两个<td>
节点数据和最后两个<td>
节点数据:
html.DocumentNode.Descendants("tr")
.Select(tr =>
from td in tr.SelectNodes("td[position() < 3 or position() > last() - 2]")
let a = td.SelectSingleNode("a[@href!='']")
select a == null ? td.InnerText : a.Attributes["href"].Value);
这个xpath按位置过滤节点:
td[position() < 3 or position() > last() - 2]