【问题标题】:associative list python关联列表python
【发布时间】:2010-06-29 14:17:24
【问题描述】:

我正在用 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 中不会以相同的顺序出现。

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

如有任何建议,请提前致谢!

【问题讨论】:

    标签: python list beautifulsoup associative


    【解决方案1】:

    我的建议是让values 成为dict。如果soup.findAll 如您所暗示的那样返回一个元组列表,那么它很简单:

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

    之后,您可以简单地通过属性名称引用值,就像彼得所说的那样。

    当然,如果 soup.findAll 没有像您暗示的那样返回元组列表,或者您的问题是元组本身以某种奇怪的方式返回(例如,而不是 ('name', 1) 会是 (1, 'name')),然后可能会更复杂一些。

    另一方面,如果soup.findAll 返回一组特定数据类型(dict 或dicts 列表、namedtuple 或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')
    

    【讨论】:

    • 对我来说,一个循环就足够了。请参阅我对彼得回答的评论。
    【解决方案2】:

    我很确定您可以将属性名称用作哈希键:

    print cell['name']
    

    【讨论】:

    • 嗯不能同时接受这两个答案:)。 thx 的帮助,基本上,对于值中的单元格:cell['name'] + ';' + cell['value'] 完成了这项工作,这里不需要双循环。
    猜你喜欢
    • 2018-12-20
    • 2013-12-15
    • 2021-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2014-12-28
    • 2023-03-25
    • 2017-06-13
    相关资源
    最近更新 更多