Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用HTMLAgilityPack和XPath进行选择性屏幕抓取_C#_Xpath_Html Agility Pack - Fatal编程技术网

C# 使用HTMLAgilityPack和XPath进行选择性屏幕抓取

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

[这个问题有个亲戚住在:]

我有一些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>
...
它获取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]