0

我已经用谷歌搜索了我的问题,但目前我还没有任何解决方案。我想IPs从这个 html 内容中获取和端口:(我有这个内容作为字符串)

我已经阅读过beautiful soup并且regexp- 我都尝试过,但我无法找到解决方案 - 而且beautiful soup速度非常慢。对不起我的英语不好。

<tr class="proxyListOdd">
<td><a href="http://whois.sc/81.196.122.86" target="_blank">81.196.122.86</a></td>
<td>8080</td>
<td>Nein</td>
<td>3</td>
<td class="proxyList_Ping" >0.44 Sek.</td>
<td><img height="24px" width="24px" alt="Rumänien" title="Rumänien" src="http://static2.proxy-listen.de/0_proxy/images/flags/ro.png"></td>
<td class="proxyList_Online arrowUp">97% </td>
<td>22:06</td>
<td><input style="align: center" title="Proxyserver übernehmen" type="image" src="/0_proxy/images/ProxyswitcherButtonOn.png" onclick="de.proxy_listen.setProxy({'U2a66iQA': '70ODEuMTk2LjEyMi44Ng==', 'uhSRlFfS': '96ODA4MA==', 'h0zMxtxH':'21MQ=='}, 'https://addons.mozilla.org/addon/proxy-listen-de_proxyswitcher/');"></td>
<td><a href='proxy:name=Proxy-listen.de&host=81.196.122.86&port=8080&foxyProxyMode=this&confirmation=popup' title="Proxyserver in FoxyProxy übernehmen."><img height="24px" width="22px" alt="FoxyProxy" src="http://static.proxy-listen.de/0_proxy/images/foxyproxy.png"></a></td>
</tr>
<tr class="proxyListEven">
<td><a href="http://whois.sc/94.126.17.68" target="_blank">94.126.17.68</a></td>
<td>3128</td>
<td>Nein</td>
<td>3</td>
<td class="proxyList_Ping" >0.95 Sek.</td>
<td><img height="24px" width="24px" alt="Schweiz" title="Schweiz" src="http://static2.proxy-listen.de/0_proxy/images/flags/ch.png"></td>
<td class="proxyList_Online arrowUp">86% </td>
<td>22:06</td>
<td><input style="align: center" title="Proxyserver übernehmen" type="image" src="/0_proxy/images/ProxyswitcherButtonOn.png" onclick="de.proxy_listen.setProxy({'U2a66iQA': '65OTQuMTI2LjE3LjY4', 'uhSRlFfS': '78MzEyOA==', 'h0zMxtxH':'52MQ=='}, 'https://addons.mozilla.org/addon/proxy-listen-de_proxyswitcher/');"></td>
<td><a href='proxy:name=Proxy-listen.de&host=94.126.17.68&port=3128&foxyProxyMode=this&confirmation=popup' title="Proxyserver in FoxyProxy übernehmen."><img height="24px" width="22px" alt="FoxyProxy" src="http://static.proxy-listen.de/0_proxy/images/foxyproxy.png"></a></td>
</tr>
<tr class="proxyListOdd">
<td><a href="http://whois.sc/89.105.247.13" target="_blank">89.105.247.13</a></td>
<td>3128</td>
<td>Nein</td>

希望你能帮助我;)制造亨利

4

4 回答 4

3

使用正则表达式

>>> import re
>>> set(m.group(0) for m in re.finditer(r'([0-9]{1,3}\.){3}[0-9]{1,3}', s))
{'81.196.122.86', '94.126.17.68', '89.105.247.13'}

请注意,此正则表达式已简化,实际上并未捕获所有 IP 地址(并​​捕获一些未捕获的值)。如果您想要更精确的匹配,根据inet_addr(3)RFC 4291,整个正则表达式如下所示:

# IPv4, common format
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9])|
# IPv4, dotted hexadecimal
(?:0x[0-9a-fA-F]{2}\.){3}0x[0-9a-fA-F]{2}|
# IPv4, dotted octal
0[0-7]{3}\.){3}0[0-7]{3}|
# IPv4, one number, hexadecimal
0x[0-9a-fA-F]{1,8})|
# IPv4, one number, octal
0[0-7]{1,11})|
# IPv4, one number, hexadecimal
[1-4][0-9]{9}|0|[1-9][0-9]{0,7}|
# IPv6, preferred form (RFC 4291 2.2.1)
(?:[0-9a-fA-F]{1,4}){7}[0-9a-fA-F]{1,4}|
# IPv6, compressed syntax (RFC 4291 2.2.2)
(?:
  [0-9a-fA-F]{0,4}::(?:[0-9a-fA-F]{1,4}:){,6}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){1}::(?:[0-9a-fA-F]{1,4}:){,4}[0-9a-fA-F]{0,4}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){2}::(?:[0-9a-fA-F]{1,4}:){,3}[0-9a-fA-F]{0,4}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){3}::(?:[0-9a-fA-F]{1,4}:){,2}[0-9a-fA-F]{0,4}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){4}::(?:[0-9a-fA-F]{1,4}:){,1}[0-9a-fA-F]{0,4}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){5}::[0-9a-fA-F]{0,4}
)|
# IPv6, alternative form (RFC 4291 2.2.3, uncompressed)
(?:[0-9a-fA-F]{1,4}){6}|(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]))|
# IPv6, alternative form (RFC 4291 2.2.3, compressed)
(?:
  [0-9a-fA-F]{0,4}::(?:[0-9a-fA-F]{1,4}:){,4}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){1}::(?:[0-9a-fA-F]{1,4}:){,3}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){2}::(?:[0-9a-fA-F]{1,4}:){,2}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){3}::(?:[0-9a-fA-F]{1,4}:){,1}|
  [0-9a-fA-F]{0,4}(?::[0-9a-fA-F]{1,4}){4}::
)
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]))

如您所见,如果您真的想匹配所有 IP 地址,则应搜索近似格式,然后(如有必要)验证地址,例如使用ipaddress. 请注意,上面的正则表达式对于您的情况是不完整的,因为它不包括可能的 HTML 字符编码,例如&#x31;1。

于 2012-07-08T20:35:08.643 回答
1

这仅适用于IPv4

re.findall('(\d+\.\d+\.\d+\.\d+)&port=(\d+)',s)
于 2012-07-08T20:36:36.033 回答
0

查看类似问题

编辑:对于这种特殊情况,您将不得不做一些不同的事情并从这组特定的 HTML 数据中正则表达式出数据(因为 IP 多次出现):

print [ ":".join((y,z)) for x,y,z in re.findall('proxyList((?=Even)|(?=Odd)).*?_blank">(.*?)</a></td>.*?<td>([0-9]+)</td>',data,flags=re.DOTALL | re.MULTILINE)]

您还可以对 Marco de Wit 所做的 'proxy:name=Proxy-listen' 部分进行正则表达式。

除此以外:

re.findall('(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)',data)

找到所有IPv4地址,将端口添加到其中,将其修改为:

re.findall('((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)):([0-9]{1,5})*',data)

它应该以这种格式找到所有 IP 和端口:(XXX.XXX.XXX.XXX:YYYYY 也就是说,它不检查端口是否有效。

于 2012-07-08T20:34:55.393 回答
0

您是否考虑过使用minidom 之类的东西?从文档中:

xml.dom.minidom 是文档对象模型接口的轻量级实现。它旨在比完整的 DOM 更简单,也更小。

于 2012-07-08T21:19:04.533 回答