C# Html Agility Pack foreach通过解析获得相同的结果代码
嗨,我正在尝试解析下面的html代码,以获得如下的ip和端口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 端口应与它
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);
}