SoupStrainer与编码

时间:2012-12-05 14:30:30

标签: python beautifulsoup

我在下面写了这句话:

[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' 

1 个答案:

答案 0 :(得分:1)

该页面上有<a>个链接,具有href属性。请改用以下内容:

[x['href'] for x in BeautifulSoup(data, parseOnlyThese=SoupStrainer('a')) if x.has_key('href')]

例如,用<a name="something" />声明链接目标是完全正常的。您也在选择这些标签,但它们没有href属性,而您的代码也失败了。