Python 的关联列表

0 投票
2 回答
1583 浏览
提问于 2025-04-16 00:34

我正在用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 个回答

2

我很确定你可以把属性名当作哈希表的一个键来使用:

print cell['name']
2

我的建议是把 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')

撰写回答