Веб-очистка и извлечение значения атрибута вместо текстового значения из td для всей таблицы beautiful soup

#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. Это потрясающе! Я не могу поверить, что пропустил такой незначительный шаг. Спасибо!!