BeautifulSoup中的Dict Index和“如果x在Dict中”

时间:2011-08-29 02:25:32

标签: python dictionary beautifulsoup

我认为我不明白如何检查数组索引是否存在......

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

2 个答案:

答案 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)语法来查看你正在玩什么以及它有什么方法。