Очистка таблицы с помощью BeautifulSoup в Jupyter Notebook - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь распечатать таблицу имен детей, указанную в формате списка, с помощью Beautifulsoup.

google-python-упражнения / google-python-упражнения / babynames / baby1990.html (HTML-страница - это скриншот фактического URL-адреса)

После извлечения таблицы с помощью urllib.request и ее синтаксического анализа с BeautifulSoup мне удалось распечатать данные внутри каждой строки таблицы, но я получаю неправильную информациювыход.

вот мой код:

right_table = soup.find('table',attrs = {"summary" : "Popularity for top 1000"})
table_rows = right_table.find_all('tr') 

for tr in table_rows:
td = tr.find_all('td')
row = [i.text for i in td]
print(row)

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

Вроде как:

['997', 'Eliezer', 'Asha', '998', 'Jory', 'Jada', '999', 'Misael', 'Leila', '1000', 'Tate', 'Peggy', 'Note: Rank 1 is the most popular,\nrank 2 is the next most popular, and so forth. \n']
['998', 'Jory', 'Jada', '999', 'Misael', 'Leila', '1000', 'Tate', 'Peggy', 'Note: Rank 1 is the most popular,\nrank 2 is the next most popular, and so forth. \n']
['999', 'Misael', 'Leila', '1000', 'Tate', 'Peggy', 'Note: Rank 1 is the most popular,\nrank 2 is the next most popular, and so forth. \n']
['1000', 'Tate', 'Peggy', 'Note: Rank 1 is the most popular,\nrank 2 is the next most popular, and so forth. \n']
['Note: Rank 1 is the most popular,\nrank 2 is the next most popular, and so forth. \n']

Как напечатать только один список?

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Я бы попробовал использовать панды и индексировать в списке результатов таблиц, чтобы получить нужную таблицу

import pandas as pd

tables = pd.read_html('yourURL')

print(tables[1]) # for example; change index as required
0 голосов
/ 02 марта 2019

Ваш цикл создает список строк, затем печатает его, а затем переходит к следующей итерации, где он создает список строк (перезаписывает предыдущий), затем печатает его и т. Д. И т. Д. И т. Д.

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

Вы действительно имеете в виду, что хотите получить список своих строк?

right_table = soup.find('table',attrs = {"summary" : "Popularity for top 1000"})
table_rows = right_table.find_all('tr') 


result_list = []
for tr in table_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    result_list = result_list + row


print(result_list)

Если вы действительно имели в виду список своих строк, используйте этот:

right_table = soup.find('table',attrs = {"summary" : "Popularity for top 1000"})
table_rows = right_table.find_all('tr') 


result_list = []
for tr in table_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    result_list.append(row)


print(result_list)

Но, честно говоря, я бы использовал pandas и .read_html (), как предлагает QHarr.

right_table = soup.find('table',attrs = {"summary" : "Popularity for top 1000"})
table_rows = right_table.find_all('tr') 


result_list = []
for tr in table_rows:
    td = tr.find_all('td')
    for data in td:
        print (td.text)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...