Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.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# Html Agility Pack foreach通过解析获得相同的结果代码_C#_.net_Html Agility Pack - Fatal编程技术网

C# Html Agility Pack foreach通过解析获得相同的结果代码

C# Html Agility Pack foreach通过解析获得相同的结果代码,c#,.net,html-agility-pack,C#,.net,Html Agility Pack,嗨,我正在尝试解析下面的html代码,以获得如下的ip和端口 IP:50.18.182.20 > Port: 443 IP:162.248.50.159 > Port: 80 所以应该是这样 IP:50.18.182.20 > Port: 443 IP:162.248.50.159 > Port: 80 但是我一直在得到它 IP:50.18.182.20 > Port: 443 IP:162.248.50.159 > Port: 443 端口应与它

嗨,我正在尝试解析下面的html代码,以获得如下的ip和端口

IP:50.18.182.20 > Port: 443

IP:162.248.50.159 > Port: 80
所以应该是这样

IP:50.18.182.20 > Port: 443

IP:162.248.50.159 > Port: 80
但是我一直在得到它

IP:50.18.182.20 > Port: 443

IP:162.248.50.159 > Port: 443
端口应与它们所使用的端口匹配,而不是两者都使用相同的端口

任何帮助都很棒,谢谢

这里是html

50.18.182.20
443
高匿名代理。
HTTP,HTTPS
美国
加利福尼亚旧金山
15秒
32.88%
10分钟前。
162.248.50.159
80
高匿名代理。
HTTP,HTTPS
美国
宾夕法尼亚州西切斯特
8s
73.97%
1小时4分钟前。
和C#代码

var htmlD=htmlDoc.DocumentNode.SelectNodes(//a[@title='Proxy details']);
var numberProxies=htmlD.Count;
对于(var指数=0;指数端口:+
htmlDoc.DocumentNode.SelectNodes(“//td”)[1].InnerText);
}
Console.ReadLine();

您试图从找到的包含锚点的标签旁边的
标签获取端口号,但操作不正确

事实上,您一直在这里选择文档的第一个
:SelectNodes(“//td”)[1]

试着替换

htmlDoc.DocumentNode.SelectNodes("//td")[1].InnerText


它将按预期工作。

您得到的结果与第二个查询相同,虽然它使用上下文,但与您正在迭代的循环无关

相反,从逻辑上考虑

// get the rows that contain proxies
var proxies = htmlDoc.DocumentNode.SelectNodes("//tr[td/a[@title='Proxy details']]");

if (proxies != null)
{
    foreach (var proxy in proxies)
    {
        // process this proxy row
        Console.WriteLine("IP:" + proxy.SelectSingleNode(td/a[@title='Proxy details']).InnerText);
        Console.WriteLine("PORT:" + proxy.SelectSingleNode(td[2]).InnerText);
    }
}

Console.ReadLine();

在XPath中,当使用
/
时,您会在整个文档中查找节点的任何实例,因此实际上会脱离上下文并错误地返回第一个端口。尝试在上下文中搜索:

您可以尝试在
HtmlNode

中使用
[NextSibling][1]
方法。您可以看到
包含端口,作为
包含
代理详细信息“
的第一个后续同级端口:


您应该得到一个
索引超出范围的
错误,因为您的计数器应该是
var numberProxies=htmlD.Count-1。只需在那里使用一个
foreach
循环。我没有得到那个错误,虽然我把代码更新到了我刚刚想到的东西,但得到了相同的结果。我实际上得到了IP:50.18.182.20>端口:80;IP:162.248.50.159>端口:80谢谢!,我花了好几个小时才把它修好:D
var htmlD = htmlDoc.DocumentNode.SelectNodes("//td[a/@title='Proxy details']");
var numberProxies = htmlD.Count;

foreach(HtmlNode node in htmlD)
{
    var ip = node.InnerText;
    var port = node.SelectSingleNode("following-sibling::td[1]").InnerText;
    Console.WriteLine("IP: {0} > Port: {1}", ip, port);
}