Почему библиотека BeautifulSoup продолжает игнорировать только один указанный элемент c <TR>? - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь получить информацию о случаях короны по странам из мировометров. По какой-то причине я не могу нацелить определенные c теги TR по классам (классы на них просто отсутствуют в консоли python, но они есть в chrome разработчику). поэтому я нацеливаюсь на все элементы tr и затем фильтрую их. все работает нормально, но по какой-то странной причине КИТАЙ отсутствует в первой десятке стран. Ничто не отличается от тегов html в Китае, но я не могу поставить его там. Любые идеи? '' '

r = requests.get("https://www.worldometers.info/coronavirus/")
content = r.content
soup = BeautifulSoup(content, "html.parser")
all_rows = soup.find_all("tr") 
startingIndex = None

for index,each in enumerate(all_rows,start=0):
    if "World" in each.text: # After that word "WORLD" comes TR elements of individual countries. 
        startingIndex = index
        break

top10 = all_rows[startingIndex+1:startingIndex+11] # here i select top 10 countries that i need.

for index,each in enumerate(top10,start = 1):
    droebiti_list = each.text.split("\n")
    print(f"{index}){droebiti_list[1]} - {droebiti_list[6]}") # and printing info about recovered people

.

' ''

Ответы [ 2 ]

0 голосов
/ 14 апреля 2020

Источник страницы, переменная content, имеет страны в другом порядке, чем в таблице (порядок может изменяться из-за сценария javascript или чего-то подобного).

Таким образом, вы можете просто собрать все данные и упорядочить их в соответствии с общим количеством дел.

import requests,time
from bs4 import BeautifulSoup

# Get the page source and clear it
r = requests.get("https://www.worldometers.info/coronavirus/")
contents = r.content
soup = BeautifulSoup(contents, "html.parser")
table = soup.find("tbody") 
countries = table.find_all("tr")
startingIndex = None

# Here we will store the top ten countries values
total=list(range(10))
names=list(range(10))
recovered=list(range(10))

# Compare each "new" country with the current top ten
for index,each in enumerate(countries[8:]):
    droebiti_list = each.text.split("\n")
    for j in range(10):
        if int(droebiti_list[2].replace(',','')) > total[j]:

            for jj in reversed(range(j,10)):
                recovered[jj]=recovered[jj-1]
                names[jj]=names[jj-1]
                total[jj]=total[jj-1]

            recovered[j]=droebiti_list[6]
            names[j]=droebiti_list[1]
            total[j]=int(droebiti_list[2].replace(',',''))
            break

    print(f"{index}){droebiti_list[1]} - {droebiti_list[2]}") 

# Print the results    
for k in range(10):
    print(names[k],'\t\t\t',recovered[k])

интересный вывод:

USA              36,254
Spain            64,727
Italy            35,435
France           27,718
Germany              64,300
UK           N/A
China            77,663
Iran             45,983
Turkey           3,957
Belgium              6,707
0 голосов
/ 14 апреля 2020

Не могу гарантировать, что этот код работает («Я в неподходящей среде для этого»), но для очистки данных этот код должен работать:

r = requests.get("https://www.worldometers.info/coronavirus/")
    content = r.content
    soup = BeautifulSoup(content, "html.parser")
    all_rows = soup.find_all("tr")

    for elements_all_rows in all_rows: # Like you said this goes trough all 'tr' elements
        ScrapedResult = []
        elements_all_rows = soup.find_all("td") # In each Tr Element you now search for 'td' elements
        for elements_elements_all_rows in elements_all_rows: # Now you go trough the td and filter the text
            ScrapedResult.append(elements_elements_all_rows.getText())
        print(ScrapedResult)

, вам просто нужно изменить ScrapedResult на ваши нужды.

...