2010-06-29 73 views
0

我解析一些HTML表单与美丽的汤。基本上我大约有60个输入字段大多是单选按钮和复选框。到目前为止,这适用于以下代码:联想列表python

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() 

正如代码,表明我的问题IST在属性选择,因为HTML模板是丑陋的,混淆的是属于输入字段参数的顺序。我对name =“somenumber”value =“someothernumber”感兴趣。不幸的是,我的attrs [1]方法不起作用,因为name和value不会在我的html中以相同的顺序出现。

有什么办法可以关联地访问生成的BeautifulSoup列表吗?

Thx提前任何建议!

回答

2

我的建议是让values一个dict。如果soup.findAll你似乎暗示会返回一个元组列表,那么它的简单:

values = dict(soup.findAll('input',checked="checked")) 

之后,你可以简单地通过他们的属性名称指的是价值观,像什么彼得说。当然,如果soup.findAll没有像你暗示的那样返回一个元组列表,或者你的问题是元组本身是以某种奇怪的方式返回的(例如,不是('name',1 )它会是(1,'name')),那么它可能会更复杂一点。另一方面,如果soup.findAll返回某一组数据类型(dict或dicts列表,名为tuple或namedtuples列表)中的一个,那么你实际上会更好,因为你不必做任何转换首先。

...是的,在检查BeautifulSoup文档后,看起来findAll返回的对象可以像对待列表中的字典一样对待,所以您可以像Peter说的那样做。

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') 
+0

对我来说,一个循环就够了..请看我的评论给彼得的答案。 – 2010-06-29 18:49:15

2

我相当肯定,你可以使用属性名像哈希的关键:

print cell['name'] 
+0

嗯不容同时接受的答案:)。 thx的帮助,基本上, 为单元格的值: cell ['name'] +';' + cell ['value'] 完成了这项工作,在这里不需要双重循环。 – 2010-06-29 18:48:24