Html Agility Pack foreach获取相同的结果代码并解析

时间:2015-05-29 11:11:46

标签: 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: 443

端口应该与它们匹配,而不是使用相同的端口..?

任何帮助都非常棒。

这是html

<td><a title="Proxy details">50.18.182.20</a></td>
<td>443</td>
<td>
High Anonymous Proxy.
</td>
<td>HTTP, HTTPS</td>
<td><img alt="United States" title="United States" src="http://flagpedia.net/data/flags/mini/us.png" />&nbsp;United States</td>
<td>San Francisco, California</td>
<td>15s</td>
<td>32.88%</td>
<td>10 Minutes ago.</td>
</tr>
<tr>
<td><a title="Proxy details">162.248.50.159</a></td>
<td>80</td>
<td>
High Anonymous Proxy.
</td>
<td>HTTP, HTTPS</td>
<td><img alt="United States" title="United States" src="http://flagpedia.net/data/flags/mini/us.png" />&nbsp;United States</td>
<td>West Chester, Pennsylvania</td>
<td>8s</td>
<td>73.97%</td>
<td>1 Hour, 4 Minutes ago.</td>

和C#代码

var htmlD = htmlDoc.DocumentNode.SelectNodes("//a[@title='Proxy details']");
var numberProxies = htmlD.Count;

for (var index = 0; index < numberProxies; index++)
{
    Console.WriteLine("IP: " + htmlD[index].InnerText + " > Port: "+
                  htmlDoc.DocumentNode.SelectNodes("//td")[1].InnerText);
}

Console.ReadLine();

4 个答案:

答案 0 :(得分:1)

您尝试从<td>标记旁边的<td>标记获取端口号包含您已找到但尚未正确执行的锚点。

事实上,您在此处选择了第一个.SelectNodes("//td")[1]文档:htmlDoc.DocumentNode.SelectNodes("//td")[1].InnerText

尝试替换

htmlD[index].ParentNode.NextSibling.NextSibling.InnerText

id = 1

它将按预期工作。

答案 1 :(得分:0)

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

相反,从逻辑上考虑一下,

ss

答案 2 :(得分:0)

在XPath中使用>>> sentence = 'munching macdonalds' >>> first, *rest = sentence.split(' ') >>> first 'munching' >>> rest ['macdonalds'] >>> sentence = 'foo bar baz' >>> first, *rest = sentence.split(' ') >>> first 'foo' >>> rest ['bar', 'baz'] 时,您会在整个文档中查找节点的任何实例,因此会有效地脱离上下文并错误地返回第一个端口。尝试在上下文中搜索:

您可以尝试使用//

中的[NextSibling][1]方法

答案 3 :(得分:0)

您可以将<td>包含端口视为包含<td>的{​​{1}}的第一个后续兄弟:

"Proxy details"