C# 使用HTMLAgilityPack和XPath进行选择性屏幕抓取
[这个问题有个亲戚住在:] 我有一些HTML需要解析,其总体外观如下:C# 使用HTMLAgilityPack和XPath进行选择性屏幕抓取,c#,xpath,html-agility-pack,C#,Xpath,Html Agility Pack,[这个问题有个亲戚住在:] 我有一些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
...
<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>
...
它获取tds的内部文本,但无法获取链接{1}。这里创建了一个包含大量列表的列表。我可以使用嵌套的foreach来管理它
方式2:
var dataList = currentDoc.DocumentNode
.SelectNodes("//tr//td//text()|//tr//td//a//@href");
这确实让我得到了链接{1}和所有数据,但它变得杂乱无章。在这里,所有的数据都以大块的形式出现。因为一个tr中的数据是相对的,所以我现在失去了这种关系
那么,如何才能获得我感兴趣的数据,只有前两列和后两列数据?以下代码将选择前两列
数据和后两列
节点数据:
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);
html.DocumentNode.substands(“tr”)
.选择(tr=>
从tr.SelectNodes中的td(“td[position()<3或position()>last()-2]”)
让a=td.SelectSingleNode(“a[@href!=”))
选择a==null?td.InnerText:a.Attributes[“href”].Value);
此xpath按位置筛选节点:
td[position() < 3 or position() > last() - 2]
td[position()<3或position()>last()-2]
@AnubhavSaini我在示例html上测试了这段代码,效果很好,每行返回四个字符串。这可能有用。我的数据已损坏,因此无法检查。但它看起来很正确。
td[position() < 3 or position() > last() - 2]