我正在编写一个程序,其目标是从网站获取链接的标题,但仅限于该链接是指某个网站。
到目前为止,我可以使用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()
答案 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.