Python正则表达式问题

时间:2014-10-04 18:06:26

标签: python html regex web-scraping html-parsing

我试图通过使用urlib扫描页面并使用正则表达式查找代理来使用python从site获取代理。

页面上的代理看起来像这样:

<a href="/ip/190.207.169.184/free_Venezuela_proxy_servers_VE_Venezuela">190.207.169.184</a></td><td>8080</td><td>

我的代码如下所示:

for site in sites:
content = urllib.urlopen(site).read()
e = re.findall("\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\<\/\a\>\<\/td\>\<td\>\d+", content)
#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}:\d+

for proxy in e:
    s.append(proxy)
    amount += 1

正则表达式:

\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\<\/\a\>\<\/td\>\<td\>\d+

我知道代码有效,但正则表达式是错误的。

关于如何解决这个问题的任何想法?

编辑:http://www.regexr.com/似乎我的正则表达式很好吗?

1 个答案:

答案 0 :(得分:3)

一种选择是使用HTML解析器来查找IP地址和端口。

示例(使用BeautifulSoup HTML解析器):

import re
import urllib2
from bs4 import BeautifulSoup

data = urllib2.urlopen('http://letushide.com/protocol/http/3/list_of_free_HTTP_proxy_servers')

IP_RE = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
PORT_RE = re.compile(r'\d+')

soup = BeautifulSoup(data)
for ip in soup.find_all('a', text=IP_RE):
    port = ip.parent.find_next_sibling('td', text=PORT_RE)
    print ip.text, port.text

打印:

80.193.214.231 3128
186.88.37.204 8080
180.254.72.33 80
201.209.27.119 8080
...

这里的想法是找到所有a标记,其中的文本与\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}正则表达式匹配。对于每个链接,请找到父母的下一个td兄弟,文字与\d+匹配。


或者,既然您知道表结构以及有IP和端口的列,您可以通过索引从每一行获取单元格值,无需在此处深入了解正则表达式:

import urllib2
from bs4 import BeautifulSoup

data = urllib2.urlopen('http://letushide.com/protocol/http/3/list_of_free_HTTP_proxy_servers')

soup = BeautifulSoup(data)
for row in soup.find_all('tr', id='data'):
    print [cell.text for cell in row('td')[1:3]]

打印:

[u'80.193.214.231', u'3128']
[u'186.88.37.204', u'8080']
[u'180.254.72.33', u'80']
[u'201.209.27.119', u'8080']
[u'190.204.96.72', u'8080']
[u'190.207.169.184', u'8080']
[u'79.172.242.188', u'8080']
[u'1.168.171.100', u'8088']
[u'27.105.26.162', u'9064']
[u'190.199.92.174', u'8080']
...