Как я могу очистить содержимое внутри класса sorting_1 с помощью Python? - PullRequest
0 голосов
/ 05 августа 2020

Мне дали проект сделать трекер covid. Я решил очистить сайт от некоторых элементов (https://www.worldometers.info/coronavirus/). Я новичок в python, поэтому решил go с BeautifulSoup. Я смог отбросить основные элементы c, такие как общие случаи, активные случаи и так далее. Однако всякий раз, когда я пытаюсь получить названия стран или номера, он возвращает пустой список. Несмотря на то, что существует класс sorting_1, он все равно возвращает пустой список. Может ли кто-нибудь подсказать мне, где я ошибаюсь?

Это то, что я пытаюсь схватить:

<td style="font-weight: bold; text-align:right" class="sorting_1">4,918,420</td>

Вот мой текущий код:

import requests
import bs4

#making a request and a soup
res = requests.get('https://www.worldometers.info/coronavirus/')
soup = bs4.BeautifulSoup(res.text, 'lxml')

#scraping starts here
total_cases = soup.select('.maincounter-number')[0].text
total_deaths = soup.select('.maincounter-number')[1].text
total_recovered = soup.select('.maincounter-number')[2].text

active_cases = soup.select('.number-table-main')[0].text

country_cases = soup.find_all('td', {'class': 'sorting_1'})

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Добро пожаловать в SO!

Глядя на их веб-сайт, кажется, что классы sorting_X добавлены javascript, поэтому их нет в исходном html.

Таблица все же существует, поэтому я бы посоветовал l oop поверх строк таблицы, подобных этому:

table_rows = soup.find("table", id="main_table_countries_today").find_all("tr")
for row in table_rows:
    
    name = "unknown"
    # Find country name
    for td in row.find_all("td"):
        if td.find("mt_a"): # This kind of link apparently only exists in the "name" column
            name = td.find("a").text

    # Do some more scraping

Предупреждение, я не работал с супом какое-то время, поэтому это может быть не на 100% правильным. Вы уловили идею.

0 голосов
/ 05 августа 2020

Вы можете получить класс sorting_1, потому что он отсутствует в исходном коде страницы. Вы нашли все строки из таблицы, а затем считали информацию из необходимых столбцов.

Итак, чтобы получить общее количество случаев для каждой страны, вы можете использовать следующий код:

import requests
import bs4

res = requests.get('https://www.worldometers.info/coronavirus/')
soup = bs4.BeautifulSoup(res.text, 'lxml')

country_cases = soup.find_all('td', {'class': 'sorting_1'})
rows = soup.select('table#main_table_countries_today tr')
for row in rows[8:18]:
    tds = row.find_all('td')
    print(tds[1].text.strip(), '=',  tds[2].text.strip())
...