过滤使用BeautifulSoup获取的URL

时间:2014-10-09 09:19:34

标签: python regex python-2.7 beautifulsoup

我正在编写一个程序,其目标是从网站获取链接的标题,但仅限于该链接是指某个网站。

到目前为止,我可以使用BeautifulSoup来获取页面上的锚标记列表(包括href =“url”位),我想将它们过滤掉,最好使用正则表达式。

我想要抓取的链接格式为:“http://section.website.com/123456”其中123456是任意6位数字​​。我已尝试下面的代码,但没有任何内容附加到数据数组。

import urllib2
from BeautifulSoup import BeautifulSoup
import re

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')]

url = ('http://awebsite.com')

ourUrl = opener.open(url).read()

soup = BeautifulSoup(ourUrl)

links = soup.findAll('a')
data = []
for i in links:
    print i
for i in links:
    if "http://section.website.com/\d+" in i:
        data.append(i.text)
for entry in data:
    print entry

raw_input()

1 个答案:

答案 0 :(得分:1)

您可以将过滤完全保留给BeautifulSoup:

links = soup.findAll('a', href=re.compile('^http://section.website.com/\d{6}$'))

此&#l;仅匹配完全 6位数的链接,结果集中不包含其他链接。

您的代码失败了,因为您需要针对href属性进行测试,而您没有使用正则表达式,只使用纯文本。如果没有正则表达式,以下内容将成为过滤的一部分:

if "http://section.website.com/" in i.get('href', ''):

但是这不会测试数字,或者测试URL是否正确地以该文本开头。

您可能想要升级到BeautifulSoup版本4;你使用的是BeautifulSoup 3,它在2年前被封存了。所有新功能和错误修正都改为版本4.