Таблица разбора Python - PullRequest
       7

Таблица разбора Python

0 голосов
/ 13 сентября 2018

Я проанализировал таблицу с этим кодом

response = urllib.request.urlopen(url)
html = response.read()
soup = BeautifulSoup(html, 'html.parser')
table = soup.find("table", attrs={"class":"table table-condensed table-bordered"})

datasets = []
for row in table.find_all("tr")[1:]:
    dataset = (td.get_text() for td in row.find_all("td"))
    print (tuple(dataset))
    datasets.append(dataset)
print("___________________________________\n")
print(tuple(dataset))
print("___________________________________\n")
print("parsing\n")

это дает

('A1 ', '- ', '- ', '- ', '- ', ' -\n ')
('A2', '- ', '- ', '- ', '- ', ' -\n ')
('A3', '- ', '- ', '- ', '- ', ' -\n ')
('A4', ' 1 W ', ' 50.1 Hz ', ' 0 V ', ' 24 °C ', ' 2018-09-12 19:05:49\n ')
('A5', ' 1 W ', ' 0 V ')

наборы данных результатов пусты

 ()

Я бы хотел, но результаты в массиве вроде бы, чтобы я мог получить доступ к каждой строке / столбцу, но и выяснить

if datasets[3][0]=='A4' print (datasets[3][2])

почему, если я изменяю код и удаляю печать (tuple (набор данных)), код работает лучше (хотя это не так, как я ожидал), но я могу иметь заполненные наборы данных, а не пустой, как очевидно:

datasets = []
for row in table.find_all("tr")[1:]:
    #dataset = dict(zip(headings, (td.get_text() for td in row.find_all("td"))))
    dataset = (td.get_text() for td in row.find_all("td"))
    datasets.append(dataset)
    #print (tuple(dataset))

print("___________________________________\n")
print(list(datasets[3]))
print(list(datasets[4]))

1 Ответ

0 голосов
/ 13 сентября 2018

Проблема в том, что этот оператор:

dataset = (td.get_text() for td in row.find_all("td"))

возвращает выражение генератора.Это похоже на итератор, в том смысле, что, как только вы выполните итерацию до конца, вы будете использовать генератор.Дальнейший доступ к генератору больше не вернет.

Когда вы печатаете содержимое набора данных в виде кортежа, он потребляет данные, поэтому при переходе к добавлению ничего не остается.Удаление оператора печати приближает вас, но вы все еще работаете с генератором, и вам нужны именно настоящие данные.

А пока попробуйте изменить строку выше на:

dataset = tuple(td.get_text() for td in row.find_all("td"))

Или просто измените enclosing () на [], чтобы сделать его понятным для списка:

dataset = [td.get_text() for td in row.find_all("td")]

Это будет использовать выражение генератора, но даст вам значения данных в кортеже или списке, который вы можете получить доступ снова и снова.Когда вы добавляете кортеж набора данных в наборы данных, он будет содержать интересующие вас значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...