【问题标题】:Find all IPs on an HTML Page查找 HTML 页面上的所有 IP
【发布时间】:2009-04-30 20:57:12
【问题描述】:

我想用 python 获取一个 HTML 页面,然后从中打印出所有的 IP。 我将定义一个 IP 如下:

x.x.x.x:y

在哪里: x = 0 到 256 之间的数字。 y =

谢谢。

【问题讨论】:

  • 您可能需要澄清一下。目前尚不清楚您要做什么。当您说“使用 python 获取 HTML 页面,然后从中打印出所有 IP”时,您是什么意思?
  • 我相信他的意思是从 HTML 中提取 IP 地址。
  • 我想下载一个网页并打印出所有格式为 x.x.x.x:y 的字符串。请澄清您的问题,因为我不明白您对我的问题的理解。
  • 您的意思是从 HTML 页面中解析出所有 URL 并创建这些 URL 所引用的 IP 地址列表(即 URL 来自的域)?
  • 或者您的意思是这些特定的 HTML 页面会明确列出它们的 IP 地址?

标签: python regex screen-scraping extract


【解决方案1】:

没错。我唯一不能做的是正则表达式。 – das 9 分钟前 如果有人告诉我,我会没事的。 – 8 分钟前

import re

ip = re.compile(r"\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?):\d{1,6}\b")
junk = " 1.1.1.1:123 2.2.2.2:321 312.123.1.12:123 "
print ip.findall(junk)

# outputs ['1.1.1.1:123', '2.2.2.2:321']

这是一个完整的例子:

import re, urllib2

f = urllib2.urlopen("http://www.samair.ru/proxy/ip-address-01.htm")
junk = f.read()

ip = re.compile(r"\b(?:(?:25[0-5]|2[0-4]\d|[01]?\d\d?)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d\d?):\d{1,6}\b")
print ip.findall(junk)

# ['114.30.47.10:80', '118.228.148.83:80', '119.70.40.101:8080', '12.47.164.114:8888', '121.
# 17.161.114:3128', '122.152.183.103:80', '122.224.171.91:3128', '123.234.32.27:8080', '124.
# 107.85.115:80', '124.247.222.66:6588', '125.76.228.201:808', '128.112.139.75:3128', '128.2
# 08.004.197:3128', '128.233.252.11:3124', '128.233.252.12:3124']

【讨论】:

  • In [9]: ip.search("255x255x255x255:12") Out[9]: <_sre.sre_match object at>
  • @llimllib: >>> ip.match("255x255x255x255:12") >>>
【解决方案2】:

基本方法是:

  • 使用urllib2下载页面内容
  • 使用regular expression 提取类似 IPv4 的地址
  • 根据每个八位字节的数字约束验证每个匹配项
  • 打印匹配列表

请提供更清晰的说明,说明您遇到问题的具体部分,以及证明您迄今为止尝试过的证据。

【讨论】:

  • 对。我唯一不能做的是正则表达式。
【解决方案3】:

不要把它变成谁更好的正则表达式作者之战,但是......

(\d{1,3}\.){3}\d{1,3}\:\d{1,6}

【讨论】:

  • IP 不能为零?
  • 需要加上一些东西来限制可接受的八位字节值。
  • "\d{1,3}" 仅表示 1-3 位数字。一对夫妇已经提交了更多“正确”的正则表达式,所以这是一个有争议的问题。
【解决方案4】:

试试:

re.compile("\d?\d?\d.\d?\d?\d.\d?\d?\d.\d?\d?\d:\d+").findall(urllib2.urlopen(url).read())

【讨论】:

  • 需要加上一些东西来限制可接受的八位字节值。
【解决方案5】:

In action

\b(?:                # A.B.C in A.B.C.D:port
    (?:
       25[0-5]
    |  2[0-4][0-9]
    |  1[0-9][0-9]
    |  [1-9]?[0-9]
    )\.
  ){3}
  (?:                # D in A.B.C.D:port
    25[0-5]
  | 2[0-4][0-9]
  | 1[0-9][0-9]
  | [1-9]?[0-9]
  )
  :[1-9]\d{0,5}     # port number any number in (0,999999]
\b

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 2017-11-19
    相关资源
    最近更新 更多