#python #pandas #web-scraping #beautifulsoup #python-requests
#python #панды #веб-очистка #beautifulsoup #python-запросы
Вопрос:
Я пытаюсь очистить некоторые данные из таблицы, но у них есть содержимое, которое я действительно хотел бы видеть в атрибуте.
Пример xml:
»’
<tr data-row="0">
<th scope ="row" class="left" data_append-csv="AlleRi00" data-stat="player" csk="Allen, Ricardo">
<a href="/players/A/AlleRi00.htm">Ricardo Allen </a>
</th>
<td class="center poptip out dnp" data-stat="week_4" data-tip"Out: Concussion" csk= "4">
<strong>O</strong>
</td>
»’
При очистке таблицы я использую следующий код:
»’
import pandas as pd
from bs4 import BeautifulSoup
import requests
url = 'https://www.pro-football-reference.com/teams/atl/2017_injuries.htm'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'lxml')
table = soup.find('table', attrs={'class': 'sortable', 'id': 'team_injuries'})
table_rows = table.find_all('tr')
final_data = []
for tr in table_rows:
td = tr.find_all(['th','td'])
row = [tr.text for tr in td]
final_data.append(row)
df = pd.DataFrame(final_data[1:],final_data[0])
»’
С моим текущим кодом я получаю хорошо выглядящий фрейм данных с заголовками и всей информацией, которая видна при просмотре таблицы. Тем не менее, я хотел бы получить «Out: Concussion» вместо «O» в таблице. Я пробовал множество способов и не могу понять это. Пожалуйста, дайте мне знать, возможно ли это с текущим процессом или я неправильно подхожу к этому.
Ответ №1:
Это должно вам помочь:
import pandas as pd
from bs4 import BeautifulSoup
import requests
url = 'https://www.pro-football-reference.com/teams/atl/2017_injuries.htm'
r = requests.get(url)
soup = BeautifulSoup(r.content, 'lxml')
table = soup.find('table', attrs={'class': 'sortable', 'id': 'team_injuries'})
table_rows = table.find_all('tr')
final_data = []
for tr in table_rows:
td = tr.find_all(['th','td'])
row = [tr['data-tip'] if tr.has_attr("data-tip") else tr.text for tr in td]
final_data.append(row)
m = final_data[1:]
final_dataa = [[m[j][i] for j in range(len(m))] for i in range(len(m[0]))]
df = pd.DataFrame(final_dataa,final_data[0]).T
df.to_csv("D:\injuries.csv", index = False)
Скриншот csv
файла (я сделал некоторое форматирование, чтобы он выглядел аккуратно):
Комментарии:
1. Потому что это не дает мне той информации, которую я хочу. Я хочу извлечь атрибут, а не текст из <td> .
2. Это потрясающе! Я не могу поверить, что пропустил такой незначительный шаг. Спасибо!!