in
运算符用于序列和映射类型,是什么让你认为BeautifulSoup
返回的对象应该正确实现它?根据BeautifulSoup文档,您应该使用[]
语法访问属性。
Re hasattr
,我想你混淆了HTML/XML属性和Python对象属性。 hasattr
适用于后者,BeaitufulSoup AFAIK不反映它在它自己的对象属性中解析的HTML/XML属性。
P.S.请注意0中的Tag
对象确实实施__contains__
- 所以也许您尝试使用错误的对象?你能否展示一个完整但很简单的例子来证明这个问题?
运行此:
from BeautifulSoup import BeautifulSoup
str = '<el at="some">ABC</el><el>DEF</el>'
z = BeautifulSoup(str)
for x in z.findAll('el'):
print type(x)
print x['at']
我得到:
<class 'BeautifulSoup.Tag'>
some
<class 'BeautifulSoup.Tag'>
Traceback (most recent call last):
File "soup4.py", line 8, in <module>
print x['at']
File "C:\Python26\lib\site-packages\BeautifulSoup.py", line 601, in __getitem__
return self._getAttrMap()[key]
KeyError: 'at'
这是我所期待的。第一个el
有一个at
属性,第二个没有 - 并且抛出一个KeyError
。
更新2:BeautifulSoup.Tag.__contains__
看起来内容标签的,而不是它的属性里面。要检查属性是否存在,请使用in
。
for x in z.findAll('el'):
print x.get('at', 'nothing')
'str'是不是你最好选择一个易变的名字,因为它掩盖了内建的str类型 - 像'xmltext'这样的东西呢? – PaulMcG 2011-05-01 20:51:01