Получение определенного элемента из таблицы сайта - PullRequest
0 голосов
/ 10 марта 2020

Я пытался получить только одно значение из таблицы на веб-сайте. Я следую учебному пособию, но в настоящее время я застрял. Моя цель - извлечь из таблицы название страны и общее количество случаев этой конкретной c страны и вывести ее на экран. Например:

Китай: 80 761 Всего случаев

Я использую Python 3,7. Это мой код:

import requests
from bs4 import BeautifulSoup

url='https://www.worldometers.info/coronavirus/'
response = requests.get(url)

soup = BeautifulSoup(response.content, 'html.parser')
table = soup.findAll('table',{'id':'main_table_countries'})

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Если у вас есть <table> теги, просто go с pandas '.read_html(). Он использует BeautifulSoup под капотом, тогда вы можете просто нарезать и нарезать кубик данных, как вам угодно:

import pandas as pd

url='https://www.worldometers.info/coronavirus/'
df = pd.read_html(url)[0]

print (df.iloc[:,:2])

Чтобы сделать это с BeautifulSoup прямо вперед. Сначала вы хотите получить тег <table>. В теге <table> получите все теги <tr> (строки). Затем выполните итерацию по каждой строке, чтобы получить все теги <td> (данные). Данные, которые вы хотите, находятся в индексных позициях 0 и 1, поэтому просто распечатайте их.

import requests
from bs4 import BeautifulSoup

url='https://www.worldometers.info/coronavirus/'
response = requests.get(url)

soup = BeautifulSoup(response.content, 'html.parser')
table = soup.find('table',{'id':'main_table_countries'})

rows = table.find_all('tr')
for row in rows:
    data = row.find_all('td')
    if data != []:
        print (data[0].text, data[1].text)

ДОПОЛНИТЕЛЬНО:

import pandas as pd

country = 'China'

url='https://www.worldometers.info/coronavirus/'
df = pd.read_html(url)[0]

print (df[df['Country,Other'] == country].iloc[:,:2])

ИЛИ

import requests
from bs4 import BeautifulSoup
import re


country = 'China'

url='https://www.worldometers.info/coronavirus/'
response = requests.get(url)

soup = BeautifulSoup(response.content, 'html.parser')
table = soup.find('table',{'id':'main_table_countries'})

rows = table.find('a', text=re.compile(country))
for row in rows:
    data = row.parent.parent.parent.find_all('td')[1].text
    print (row, data)
0 голосов
/ 10 марта 2020

Вы можете получить информацию о цели следующим образом:

for t in table[0].find_all('tr'):
    target = t.find_all('td')
    if len(target)>0:
        print(target[0].text, target[1].text)

Вывод:

China  80,761
 Italy  9,172
 Iran  8,042

et c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...