我认为我不明白如何检查数组索引是否存在......
for tag in soup.findAll("input"):
print tag['type']
if 'type' in tag:
print "b"
输出:
2255
text
hidden
text
text
text
Traceback (most recent call last):
File "/home//workspace//src/x.py", line 268, in <module>
print tag['type']
File "/home//workspace//src/BeautifulSoup.py", line 601, in __getitem__
return self._getAttrMap()[key]
KeyError: 'type'
为什么不输出'b'?
答案 0 :(得分:2)
BeautifulSoup Tag
不是dict
。有时它以某种方式表现得像一个([]
表示法,因为你发现获得属性的值),但在其他方面却没有。 in
上的Tag
会检查代码是否是该代码的直接子代;它不会检查属性。
相反,你可以这样做:
if not tag.get('type', None):
pass # type is empty or nonexistent
答案 1 :(得分:1)
为什么不输出'b'?
你假设从findAll返回的标签是dicts,而实际上它们不是。您正在使用的BeautifulSoup库有自己的自定义类,在本例中为BeautifulSoup.Tag,它可能像dict一样工作,但不是。
在这里,看一下:
>>> doc = ['<html><head><title>Page title</title></head>', ... '<body><p id="firstpara" align="center">This is paragraph <b>one</b>.', ... '<p id="secondpara" align="blah">This is paragraph <b>two</b>.', ... '</html>'] >>> soup = BeautifulSoup(''.join(doc)) >>> tag = soup.findAll("p")[0] >>> type(tag) class 'BeautifulSoup.Tag'> >>> isinstance(tag, dict) False
因为它实际上不是一个字典,所以你会得到一些不同的(特定于域的)行为,在这种情况下是一个直接子节点的列表(标签中包含的标签,你正在“索引”)。
看起来您想知道输入标记是否具有 type 属性,因此根据BeautifulSoup文档,您可以使用标记列出标记的属性。 attrs和attrMap。
>>> tag.attrs [(u'id', u'firstpara'), (u'align', u'center')] >>> tag.attrMap {u'align': u'center', u'id': u'firstpara'} >>> 'id' in tag.attrMap True
BeautifulSoup是一个非常有用的库,但是你需要玩一些才能获得你想要的结果。确保花时间在交互式控制台中玩这些类,并记住使用help(someobject)语法来查看你正在玩什么以及它有什么方法。