Получить только данные таблицы, а не все данные таблицы с классом - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь очистить веб-сайт, l oop, чтобы получить только имена состояний, а не все классы в данных таблицы. Но когда я через l oop передаю все данные таблицы, есть ли способ исключить класс td?

page = requests.get("https://www.theguardian.com/world/ng-interactive/2020/apr/13/coronavirus-map-us-latest-covid-19-cases-state-by-state")
soup = BeautifulSoup(page.content, 'html.parser')
state_table = soup.find(id='co-table-container')
item_cases = state_table.find(class_='co-table')
states = [s.get_text() for s in item_cases.find_all('td')]
print(states)

Ответы [ 3 ]

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

Это работает:

response = requests.get('https://www.theguardian.com/world/ng-interactive/2020/apr/13/coronavirus-map-us-latest-covid-19-cases-state-by-state')

soup = BeautifulSoup(response.text, 'html.parser')

# get all rows from the table with class: co-table
rows = soup.find('table', {'class':'co-table'}).findAll('tr')

# loop through each row to get the state name
# note that we skip first row; we don't want the heading
for i in range(1, len(rows)):
    print(rows[i].td.text)
0 голосов
/ 16 апреля 2020

Вы можете просто использовать pandas функцию read_html(). Он использует BeautifulSoup под капотом для анализа <table> теги в html.

import pandas as pd

url = 'https://www.theguardian.com/world/ng-interactive/2020/apr/13/coronavirus-map-us-latest-covid-19-cases-state-by-state'
df = pd.read_html(url)[0].dropna(axis=1)

print (list(df['State/territory']))

Вывод:

['New York', 'New Jersey', 'Massachusetts', 'Michigan', 'California', 'Pennsylvania', 'Illinois', 'Florida', 'Louisiana', 'Texas', 'Georgia', 'Connecticut', 'Washington', 'Maryland', 'Indiana', 'Colorado', 'Ohio', 'Virginia', 'Tennessee', 'North Carolina', 'Missouri', 'Alabama', 'Arizona', 'Wisconsin', 'South Carolina', 'Rhode Island', 'Mississippi', 'Nevada', 'Utah', 'Kentucky', 'Oklahoma', 'District of Columbia', 'Delaware', 'Iowa', 'Minnesota', 'Oregon', 'Arkansas', 'Kansas', 'Idaho', 'New Mexico', 'South Dakota', 'New Hampshire', 'Puerto Rico', 'Nebraska', 'Maine', 'Vermont', 'West Virginia', 'Hawaii', 'Montana', 'North Dakota', 'Alaska', 'Wyoming', 'Guam', 'Virgin Islands']
0 голосов
/ 16 апреля 2020

Вы должны использовать функцию strip(). что-то вроде следующего

 page = requests.get("https://www.theguardian.com/world/ng- 
 interactive/2020/apr/13/coronavirus-map-us-latest-covid-19-cases-state-by-state")
 soup = BeautifulSoup(page.content, 'html.parser')
 state_table = soup.find(id='co-table-container')
 item_cases = state_table.find(class_='co-table')
 data = []

 for tr in item_cases.find_all("tr"):
    _class = tr.get("class")
    myData = {}

    #skip table body header
    if _class is not None and "thead" == _class[0]:
        continue

    #scrap details
    for td in tr.find_all("td"):
        myData[td['data-stat']] = td.text.strip()

        """ add if condition like if you want to exclude any specific 

            # find about td['data-stat'] when you inspect in table row columns
            if td['data-stat'] == "name":
                myData['name'] = td.text.strip()

        """

    data.append(myData)

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