Соберите несколько отдельных таблиц на одной веб-странице. - PullRequest
1 голос
/ 10 января 2020

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

import bs4 as bs
import urllib.request
import pandas as pd

source = urllib.request.urlopen('https://www.URLHERE.com').read()
soup = bs.BeautifulSoup(source, 'lxml')
tables = soup.select('table')[-1]
rows = tables.find_all('tr')
output = []

for rows in rows:
    cols = rows.find_all('td') 
    cols = [item.text.strip() for item in cols] 
    output.append([item for item in cols if item])
df = pd.DataFrame(output, columns = ['1','2', '3', '4', '5', '6'])
df = df.iloc[1:]

print(df) 

Если я удалю [-1] из моей табличной переменной, то получу ошибку ниже.

AttributeError: 'list' object has no attribute 'find_all'

Что мне нужно изменить, чтобы убрать все таблицы со страницы?

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Я лучше взглянул на это, и вот пример кода, который я тестировал:

source = urllib.request.urlopen('URL').read()
soup = bs.BeautifulSoup(source, 'lxml')
tables = soup.select('table')
print("I found " + str(len(tables)) + " tables.")

all_rows = []
for table in tables:
    print("Searching for <tr> items...")
    rows = table.find_all('tr')
    print("Found " + str(len(rows)) + "rows.")
    for row in rows:
        all_rows.append(row)


print("In total i have got " + str(len(all_rows)) + " rows.")

# example of first row
print(all_rows[0])

Небольшое объяснение: проблема с ошибкой атрибута при удалении [-1] заключалась в том, что tables переменная была объектом List - и у него нет метода find_all.

Ваш трек с [-1] в порядке - я предполагаю, что вы знаете, что [-1] захватывает последние элементы из списка. То же самое вы должны сделать со всеми элементами - что показано в приведенном выше коде.

Вам может быть интересно прочитать о конструкции for на python и итерациях: https://pythonfordatascience.org/for-loops-and-iterations-python/

0 голосов
/ 10 января 2020

Вы уже на правильном пути, как уже сказал комментатор, вам нужно find_all таблиц, затем вы можете применить строку logi c, которую вы уже используете, к каждой таблице в al oop вместо только первой таблицы. Ваш код будет выглядеть примерно так:

tables = soup.find_all('table')
for table in tables:
    # individual table logic here

    rows = table.find_all('tr')
    for row in rows:
        # individual row logic here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...