findAll()方法不起作用

时间:2014-05-02 06:32:43

标签: python beautifulsoup

我正在尝试从抓取的链接中删除所有标记。

这是代码

request = urllib2.Request("http://sport.detik.com/sepakbola/")
response = urllib2.urlopen(request)
soup = BeautifulSoup.BeautifulSoup(response)

   for a in soup.findAll('a'):
   if 'http://sport.detik.com/sepakbola/read/' in a['href']:
            urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', a)

不幸的是,它不起作用,并且它在findAll()中表示预期的字符串或缓冲区,它是否就像每个输出都不是字符串?任何帮助都将得到满足

感谢

2 个答案:

答案 0 :(得分:2)

此处的代码缩进不正确。请修理它。将最后一行更改为:

urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', a['href'])

a这里是<class 'bs4.element.Tag'>类型,而不是字符串。所以你得到了错误。将其更改为a['href'] <type 'str'>

答案 1 :(得分:0)

循环中的

a不是字符串,它是字典(或者,特别是BeautifulSoup.Tag)。在您的if语句中,您正确地从字典中获取href字符串以进行比较,但在匹配正则表达式时,您不会。

在正则表达式匹配中简单地使用字符串a['href']而不是字典a将修复运行时错误;

for a in soup.findAll('a'):
  if 'http://sport.detik.com/sepakbola/read/' in a['href']:
    urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', a['href'])