Как очистить таблицу на нескольких веб-страницах, используя Beautiful Soup и Pandas?

#python #pandas #loops #web-scraping #beautifulsoup

#python #pandas #циклы #очистка веб-страниц #beautifulsoup

Вопрос:

Я новичок в python и bs4. Я часами пытался очистить таблицу на нескольких веб-страницах, используя beautiful soup и pandas. Когда я очистил 2 страницы, это сработало, но когда я попытался очистить все 13 веб-страниц, у меня возникли проблемы. Когда я изменил функцию диапазона с 2 на 13, код не создает ни DF, ни CSV-файл. Что я делаю неправильно?

 dfs=[]

for page in range(13):
    http = "http://websitexample/Records?year=2020amp;page={}".format(page 1)

    url = requests.get(http)
    soup = BeautifulSoup(url.text, "lxml")
    table = soup.find('table')
    df_list = pd.read_html(url.text)
    df = pd.concat(df_list)
    
    links = []
    for tr in table.find_all("tr"): 
        trs = tr.find_all("td")
        for each in trs:
            try: 
                link = each.find('a')['href']
                links.append(link)
            except: 
                pass
    
    df['Link']= links
    dfs.append(df)

final_df = pd.concat(dfs)
final_df.to_csv("NewFileAll13.csv",index=False,encoding='utf-8-sig')
  

Я получаю сообщение об ошибке:

Ошибка значения: длина значений не соответствует длине индекса.

Я был бы очень признателен за любые предоставленные советы. Спасибо!

Комментарии:

1. Можете ли вы поделиться фактическим URL-адресом?

2. url = reactwarn.floridajobs.org/WarnList/Records?year=2020amp;page =

Ответ №1:

Чтобы загрузить все данные ссылки со всех страниц, вы можете использовать этот пример:

 import requests
import pandas as pd
from bs4 import BeautifulSoup

url = 'http://reactwarn.floridajobs.org/WarnList/Records'
params = {
    'year': 2020,
    'page': 1
}

all_data = []
for params['page'] in range(1, 14):
    print('Page {}..'.format(params['page']))

    soup = BeautifulSoup(requests.get(url, params=params).content, 'lxml')

    for row in soup.select('tbody tr'):
        tds = [td.get_text(strip=True, separator='n') for td in row.select('td')][:-1]   [row.a['href'] if row.a else '']
        all_data.append(tds)

df = pd.DataFrame(all_data, columns=['Company Name', 'State Notification Date', 'Layoff Date', 'Employees Affected', 'Industry', 'Attachment'])
print(df)
df.to_csv('data.csv', index=False)
  

С принтами:

                                            Company Name  ...                                         Attachment
0     TrueCore Behavioral Solutionsn5050 N.E. 168th...  ...  /WarnList/Download?file=\deo-wpdb005Re...
1     Cuba Libre Orlando, LLC t/a Cuba Libre Restaur...  ...  /WarnList/Download?file=\deo-wpdb005Re...
2     Hyatt Regency Orlandon9801 International Dr.O...  ...  /WarnList/Download?file=\deo-wpdb005Re...
3     ABM. Inc.nNova Southeastern University3301 Co...  ...  /WarnList/Download?file=\deo-wpdb005Re...
4     Newport Beachside Resortn16701 Collins Avenue...  ...  /WarnList/Download?file=\deo-wpdb005Re...
...                                                 ...  ...                                                ...
1251  P.F. Chang's China Bistron3597 S.W. 32nd Ct.,...  ...  /WarnList/Download?file=\deo-wpdb005Re...
1252  P.F. Chang's China Bistron11361 N.W. 12th St....  ...  /WarnList/Download?file=\deo-wpdb005Re...
1253  P.F. Chang's China Bistron8888 S.W. 136th St....  ...  /WarnList/Download?file=\deo-wpdb005Re...
1254  P.F. Chang's China Bistron17455 Biscayne Blvd...  ...  /WarnList/Download?file=\deo-wpdb005Re...
1255  Grand Hyatt Tampa Bayn2900 Bayport DriveTAMPA...  ...  /WarnList/Download?file=\deo-wpdb005Re...

[1256 rows x 6 columns]
  

и сохраняет data.csv (скриншот из LibreOffice):

введите описание изображения здесь