Как использовать pd.read_html() для извлечения табличных данных с веб-сайта без ошибки в Python?

#python #pandas #web-scraping #beautifulsoup #request

Вопрос:

Я создал программу, которая собирает табличные данные в следующем месте. И при извлечении данных в библиотеке soup это выглядит нормально, но при преобразовании html-кодов в таблицу с использованием библиотеки pandas pd.read_html(таблица) Я получаю сообщение об ошибке, я не знаю, почему

этот код ниже :

 import requests
from bs4 import BeautifulSoup
import pandas as pd

header = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}

url = "https://www.worldometers.info/coronavirus/#countries"
req = requests.get(url, headers=header)

#test of response server (permession for client)
""" True response with 200 and not forbiden access """

#soup methode : extract data finded in html page from the link
soup = BeautifulSoup(req.content, 'lxml')
tables = soup.find('table',{'id':'main_table_countries_today'})
df = pd.read_html(tables)
print(df)
 

после оправдания :

 Traceback (most recent call last):
  File "c:UserspcDesktopmanual scrapescrape 1covid find all data.py", line 18, in <module>
    df = pd.read_html(tables)
  File "C:UserspcAppDataRoamingPythonPython39site-packagespandasutil_decorators.py", line 299, in wrapper
    return func(*args, **kwargs)
  File "C:UserspcAppDataRoamingPythonPython39site-packagespandasiohtml.py", line 1085, in read_html
    return _parse(
  File "C:UserspcAppDataRoamingPythonPython39site-packagespandasiohtml.py", line 893, in _parse
    tables = p.parse_tables()
  File "C:UserspcAppDataRoamingPythonPython39site-packagespandasiohtml.py", line 213, in parse_tables
    tables = self._parse_tables(self._build_doc(), self.match, self.attrs)
  File "C:UserspcAppDataRoamingPythonPython39site-packagespandasiohtml.py", line 717, in _build_doc
    r = parse(self.io, parser=parser)
  File "C:UserspcAppDataRoamingPythonPython39site-packageslxmlhtml__init__.py", line 939, in parse
    return etree.parse(filename_or_url, parser, base_url=base_url, **kw)
  File "srclxmletree.pyx", line 3521, in lxml.etree.parse
  File "srclxmlparser.pxi", line 1875, in lxml.etree._parseDocument
TypeError: 'NoneType' object is not callable
PS C:UserspcDesktopmanual scrapescrape 1>
 

Программа предназначена для печати табличных данных во время выполнения кода с использованием pd.read_html()
Такие как :

скриншот этой таблицы

Ответ №1:

Преобразуйте soup строку в перед передачей в .read_html() :

 import requests
from bs4 import BeautifulSoup
import pandas as pd

header = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36"
}

url = "https://www.worldometers.info/coronavirus/#countries"
req = requests.get(url, headers=header)

# test of response server (permession for client)
""" True response with 200 and not forbiden access """

# soup methode : extract data finded in html page from the link
soup = BeautifulSoup(req.content, "lxml")
tables = soup.find("table", {"id": "main_table_countries_today"})
df = pd.read_html(str(tables).upper())[0]  # <-- convert the soup to str first
print(df)
 

С принтами:

          #           COUNTRY,OTHER  TOTALCASES  NEWCASES  TOTALDEATHS  NEWDEATHS  TOTALRECOVERED  NEWRECOVERED  ACTIVECASES  SERIOUS,CRITICAL  TOT CASES/1M POP  DEATHS/1M POP   TOTALTESTS  TESTS/ 1M POP    POPULATION          CONTINENT  1 CASEEVERY X PPL  1 DEATHEVERY X PPL  1 TESTEVERY X PPL  NEW CASES/1M POP  NEW DEATHS/1M POP  ACTIVE CASES/1M POP
0      NaN           NORTH AMERICA    48516635  142956.0    1000760.0     2587.0      37927770.0       60945.0    9588105.0           32950.0               NaN            NaN          NaN            NaN           NaN      NORTH AMERICA                NaN                 NaN                NaN               NaN                NaN                  NaN
1      NaN                    ASIA    70629576  250387.0    1043218.0     3825.0      65875219.0      257280.0    3711139.0           40409.0               NaN            NaN          NaN            NaN           NaN               ASIA                NaN                 NaN                NaN               NaN                NaN                  NaN
2      NaN           SOUTH AMERICA    36987244   27316.0    1132455.0      757.0      34786052.0        1198.0    1068737.0           15195.0               NaN            NaN          NaN            NaN           NaN      SOUTH AMERICA                NaN                 NaN                NaN               NaN                NaN                  NaN
3      NaN                  EUROPE    55607330  135394.0    1176585.0     1575.0      50739008.0      129944.0    3691737.0           11644.0               NaN            NaN          NaN            NaN           NaN             EUROPE                NaN                 NaN                NaN               NaN                NaN                  NaN
4      NaN                  AFRICA     7902675   11584.0     197645.0      305.0       7027951.0       16775.0     677079.0            4464.0               NaN            NaN          NaN            NaN           NaN             AFRICA                NaN                 NaN                NaN               NaN                NaN                  NaN
5      NaN                 OCEANIA      166231    1768.0       2196.0        8.0        118215.0        1108.0      45820.0             237.0               NaN            NaN          NaN            NaN           NaN  AUSTRALIA/OCEANIA                NaN                 NaN                NaN               NaN                NaN                  NaN
6      NaN                     NaN         721       NaN         15.0        NaN           706.0           NaN          0.0               0.0               NaN            NaN          NaN            NaN           NaN                NaN                NaN                 NaN                NaN               NaN                NaN                  NaN
7      NaN                   WORLD   219810412  569405.0    4552874.0     9057.0     196474921.0      467250.0   18782617.0          104899.0           28200.0          584.1          NaN            NaN           NaN                ALL                NaN                 NaN                NaN               NaN                NaN                  NaN
8      1.0                     USA    40449279  115125.0     661200.0     1237.0      31175601.0       37665.0    8612478.0           25675.0          121372.0         1984.0  588098779.0      1764643.0  3.332678e 08      NORTH AMERICA                8.0               504.0                1.0            345.00               4.00              25843.0
9      2.0                   INDIA    32902293   45430.0     439900.0      341.0      32056062.0       34965.0     406331.0            8944.0           23572.0          315.0  524868734.0       376027.0  1.395828e 09               ASIA               42.0              3173.0                3.0             33.00               0.20                291.0
10     3.0                  BRAZIL    20830495   26280.0     581914.0      686.0      19775873.0           NaN     472708.0            8318.0           97192.0         2715.0   56897224.0       265475.0  2.143224e 08      SOUTH AMERICA               10.0               368.0                4.0            123.00               3.00               2206.0
11     4.0                  RUSSIA     6956318   18985.0     184812.0      798.0       6218048.0       18669.0     553458.0            2300.0           47644.0         1266.0  179500000.0      1229389.0  1.460075e 08             EUROPE               21.0               790.0                1.0            130.00               5.00               3791.0

...and so on.
 

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

1. Спасибо , но почему он не печатает все данные, почему он отображает только несколько, зная, что таблица длинная?

2. @danielmalten Он печатает 238 строк, не так ли?

3. Во время выполнения выполнение выводит только несколько фрагментов из 238. Только 10 из них появляются, я не знаю, в чем проблема

4. @danielmalten Это может зависеть от того, где вы запускаете сценарий и как вы показываете результаты (на Юпитере? Может быть, он настроен на отображение только первых 10 строк фрейма данных…)

5. Я только что преобразовал таблицу в csv-файл и записал все 238 строк. Возможно, программа в момент выполнения занимает ограниченное пространство во временной памяти компьютера, поэтому она не отображает все данные во время выполнения