ассоциативный список питона - PullRequest
0 голосов
/ 29 июня 2010

Я разбираю 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?

Заранее спасибо за любые предложения!

Ответы [ 2 ]

2 голосов
/ 29 июня 2010

Я предлагаю сделать values a dict. Если soup.findAll возвращает список кортежей, как вы, вероятно, подразумеваете, то это так просто:

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

После этого вы можете просто ссылаться на значения по имени их атрибута, например, как сказал Питер.

Конечно, если soup.findAll не возвращает список кортежей, как вы предполагали, или если ваша проблема в том, что сами кортежи возвращаются каким-то странным способом (например, вместо ('name', 1) это будет (1, 'name')), тогда это может быть немного сложнее.

С другой стороны, если soup.findAll вернет один из определенного набора типов данных (dict или список dicts, namedtuple или список namedtuples), то на самом деле вам будет лучше, потому что вам не придется сделайте любое преобразование в первую очередь.

... Да, после проверки документации 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')
2 голосов
/ 29 июня 2010

Я вполне уверен, что вы можете использовать имя атрибута как ключ для хеша:

print cell['name']
...