Python Dict索引';s在BeautifulSoup和;如果Dict中的x“;

Python Dict索引';s在BeautifulSoup和;如果Dict中的x“;,python,dictionary,beautifulsoup,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

我不知道如何检查数组索引是否存在

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'
2255
文本
隐藏的
文本
文本
文本
回溯(最近一次呼叫最后一次):
文件“/home//workspace//src/x.py”,第268行,在
打印标签['type']
文件“/home//workspace//src/BeautifulSoup.py”,第601行,在__
返回self.\u getAttrMap()[key]
KeyError:“类型”

为什么它从来没有输出过“b”?

一个漂亮的标签组
不是一个
dict
。有时,它在某些方面的行为类似于一个属性(
[]
您发现的表示法获取属性的值),但在其他方面则不然<
标记上的
中的code>将检查标记是否是该标记的直接子级;它不检查属性

相反,您可以这样做:

if not tag.get('type', None):
    pass # type is empty or nonexistent

漂亮的组
标记
不是
命令
。有时,它在某些方面的行为类似于一个属性(
[]
您发现的表示法获取属性的值),但在其他方面则不然<
标记上的
中的code>将检查标记是否是该标记的直接子级;它不检查属性

相反,您可以这样做:

if not tag.get('type', None):
    pass # type is empty or nonexistent
为什么它从来没有输出过“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 >>>doc=[“页面标题”, 这是第一段, 这是第二段, ... ''] >>>汤=美丽的汤(''.join(doc)) >>>tag=soup.findAll(“p”)[0] >>>类型(标签) 类“BeautifulSoup.Tag”> >>>isinstance(标记、命令) 假的 因为它实际上不是一个dict,所以您得到了一些不同的(特定于域的)行为,在本例中是一个直系子项列表(您正在“索引”的标记中立即包含的标记)

看起来您想知道输入标记是否具有属性类型,因此根据BeautifulSoup文档,您可以使用tag.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 >>>tag.attrs [(u'id',u'firstpara'),(u'align',u'center')] >>>tag.attrMap {u'align':u'center',u'id':u'firstpara'} >>>tag.attrMap中的“id” 真的 BeautifulSoup是一个非常有用的库,但是你必须对它稍加利用才能得到你想要的结果。确保花时间在交互式控制台上玩这些类,并记住使用help(someobject)语法查看您正在玩什么以及它有哪些方法

为什么它从来没有输出过“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 >>>doc=[“页面标题”, 这是第一段, 这是第二段, ... ''] >>>汤=美丽的汤(''.join(doc)) >>>tag=soup.findAll(“p”)[0] >>>类型(标签) 类“BeautifulSoup.Tag”> >>>isinstance(标记、命令) 假的 因为它实际上不是一个dict,所以您得到了一些不同的(特定于域的)行为,在本例中是一个直系子项列表(您正在“索引”的标记中立即包含的标记)

看起来您想知道输入标记是否具有属性类型,因此根据BeautifulSoup文档,您可以使用tag.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 >>>tag.attrs [(u'id',u'firstpara'),(u'align',u'center')] >>>tag.attrMap {u'align':u'center',u'id':u'firstpara'} >>>tag.attrMap中的“id” 真的 BeautifulSoup是一个非常有用的库,但是你必须对它稍加利用才能得到你想要的结果。确保花时间在交互式控制台上玩这些类,并记住使用help(someobject)语法查看您正在玩什么以及它有哪些方法