我在下面写了这句话:
[x['href'] for x in BeautifulSoup(data, parseOnlyThese=SoupStrainer('a'))]
数据由python2.7中的urllib.urlopen(XXX).read()
实现。
当XXX是一个由英文字符总数组成的页面时,它会很有效,例如http://python.org。但是当它出现在页面上时会有一些中文字符,它会失败。
会有一个KeyError。 [x for ...]
返回一个空列表。
更重要的是,如果没有parseOnlyThese=SoupStrainer('a')
,两者都可以。
是否有SoupStrainer的错误?
from BeautifulSoup import BeautifulSoup, SoupStrainer
import urllib
data = urllib.urlopen('http://tudou.com').read()
[x['href'] for x in BeautifulSoup(data, parseOnlyThese=SoupStrainer('a'))]
给出了追溯:
Traceback (most recent call last):
File "<pyshell#3>", line 1, in <module>
[x['href'] for x in BeautifulSoup(data, parseOnlyThese=SoupStrainer('a'))]
File "F:\ActivePython27\lib\site-packages\beautifulsoup-3.2.1-py2.7.egg\BeautifulSoup.py", line 613, in __getitem__
return self._getAttrMap()[key]
KeyError: 'href'
答案 0 :(得分:1)
该页面上有<a>
个链接,不具有href
属性。请改用以下内容:
[x['href'] for x in BeautifulSoup(data, parseOnlyThese=SoupStrainer('a')) if x.has_key('href')]
例如,用<a name="something" />
声明链接目标是完全正常的。您也在选择这些标签,但它们没有href
属性,而您的代码也失败了。