Python 的关联列表
我正在用Beautiful Soup解析一些HTML表单。基本上,我有大约60个输入字段,主要是单选按钮和复选框。到目前为止,我用以下代码实现了这个功能:
from BeautifulSoup import BeautifulSoup
x = open('myfile.html','r').read()
out = open('outfile.csv','w')
soup = BeautifulSoup(x)
values = soup.findAll('input',checked="checked")
# echoes some output like ('name',1) and ('value',4)
for cell in values:
# the following line is my problem!
statement = cell.attrs[0][1] + ';' + cell.attrs[1][1] + ';\r'
out.write(statement)
out.close()
x.close()
正如代码所示,我的问题在于选择属性的地方,因为HTML模板很乱,输入字段的参数顺序混在一起。我对name="somenumber"和value="someothernumber"感兴趣。不幸的是,我的attrs[1]方法不管用,因为在我的HTML中,name和value的顺序并不一致。
有没有办法以关联的方式访问BeautifulSoup生成的列表呢?
提前感谢任何建议!
2 个回答
我很确定你可以把属性名当作哈希表的一个键来使用:
print cell['name']
我的建议是把 values
变成一个 dict
(字典)。如果 soup.findAll
返回的是一个元组的列表,就像你说的那样,那么处理起来就很简单:
values = dict(soup.findAll('input',checked="checked"))
之后你可以直接通过属性名来引用这些值,就像彼得说的那样。
当然,如果 soup.findAll
返回的不是元组的列表,或者你的问题是元组本身以某种奇怪的方式返回(比如不是 ('name', 1) 而是 (1, 'name')),那就可能会复杂一些。
另一方面,如果 soup.findAll
返回的是某种特定的数据类型(比如字典或字典的列表,命名元组或命名元组的列表),那你其实会更好,因为你根本不需要进行任何转换。
...是的,经过查看 BeautifulSoup 的文档,似乎 findAll
返回的是可以像字典列表那样处理的对象,所以你可以按照彼得说的做。
http://www.crummy.com/software/BeautifulSoup/documentation.html#The%20attributes%20of%20Tags
哦,对了,如果你想遍历这些属性,可以这样做:
for cell in values:
for attribute in cell:
out.write(attribute + ';' + str(cell[attribute]) + ';\r')