0

美しいスープでいくつかの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" に興味があります。残念ながら、html では名前と値が同じ順序で発生しないため、attrs[1] アプローチは機能しません。

結果の BeautifulSoup リストに連想的にアクセスする方法はありますか?

提案がある場合は、事前に Thx をお寄せください。

4

2 に答える 2

2

ハッシュのキーのように属性名を使用できると確信しています。

print cell['name']
于 2010-06-29T14:19:43.400 に答える
2

私の提案はを作るvaluesことdictです。soup.findAllあなたが示唆しているようにタプルのリストを返す場合、それは次のように単純です:

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

その後、Peterが言ったように、属性名で値を参照できます。

もちろん、soup.findAll暗黙のようにタプルのリストが返されない場合、またはタプル自体が奇妙な方法で返されることが問題である場合(('name'、1)の代わりに('name'、1)のように) 1、'name'))の場合、もう少し複雑になる可能性があります。

一方、soup.findAll特定のデータ型のセット(dictまたはdictのリスト、namedtupleまたはnamedtupleのリスト)の1つを返す場合は、最初に変換を行う必要がないため、実際にはより良い結果が得られます。場所。

...ええ、BeautifulSoupのドキュメントを確認したところfindAll、dictのリストのように扱うことができるオブジェクトが返されるように見えるので、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')
于 2010-06-29T14:26:41.493 に答える