Красивый суп, выделяющий конкретные столбцы

медленно изучая питон и красивую музыку, он был озадачен этим.

Я пытаюсь извлечь 1-й и 4-й столбцы данных из следующего макета (уменьшенного размера) http://pastebin.com/********

файл хранится локально, и в настоящее время у меня есть исправление кода из других подобных проблем, которые я не могу заставить работать

for row in soup.find('table')[0]body.findall('tr'):
first_column = row.findAll('td')[0].contents
third_column = row.findAll('td')[3].contents
print (first_column, third_column)
2 ответа

Есть много вещей, которые не соответствуют вашему коду. Эта строка:

soup.find('table')[0]body.findall('tr'):

без разницы. Когда вы используете find он возвращает один объект BS. Вы не можете обращаться к элементам с индексом на одном объекте. И везде, где вы используете findAll, он возвращает список объектов BS. Это означает, что вам нужно зацикливаться на нем, чтобы получить отдельные элементы. Именно по этой причине тело вашего цикла for не будет работать должным образом.

Ниже приведен код, который позволяет получить то, что вы хотите:

from bs4 import BeautifulSoup

html_file = open('html_file')
soup = BeautifulSoup(html_file)

table = soup.findAll('table')[0]
rows = table.findAll('tr')

first_columns = []
third_columns = []
for row in rows[1:]:
 first_columns.append(row.findAll('td')[0])
 third_columns.append(row.findAll('td')[2])

for first, third in zip(first_columns, third_columns):
 print(first.text, third.text)


Вы можете найти htql проще для этого:

import htql
results=htql.query(html_data, "1. {c1=<table><tbody><tr><td>1:tx; c4=</td><td>4:tx } ");
 </td></tr></tbody></table>

licensed under cc by-sa 3.0 with attribution.