2 votes

Pandas read_html() renvoie 'nan' sur une colonne spécifique

J'utilise pandas pour récupérer un site web, mais il renvoie une colonne entière avec le nom de l'utilisateur. 'nan' au lieu des valeurs appropriées. J'ai essayé de modifier plusieurs read_html() paramètres, tels que la saveur, les convertisseurs et les valeurs na_, sans succès. J'ai remarqué que le code html de la colonne troublée diffère en ce sens que les autres sont 'td class=' tandis que celui qui n'est pas lu correctement lit 'td data-behavior=' . Lorsque je copie/colle simplement le tableau dans Excel, tout est collé correctement. Je vous serais reconnaissant de bien vouloir m'aider.

J'ai essayé de changer certains paramètres sur read_html() sans succès. J'ai également essayé d'obtenir la table en utilisant lxml/xpath et je n'ai pas réussi non plus.

week_data = pd.read_html('https://www.espn.co.uk/nfl/fixtures/_/week/2/seasontype/1',
                          converters={'time': str})

La colonne doit comporter des chaînes de caractères contenant l'heure du match.

2voto

clockwatcher Points 1551

Ils intègrent la date et l'heure dans l'attribut data-date. Une autre option, plutôt que de recourir à Selenium, consiste à extraire cet attribut et à le placer dans l'élément td en utilisant beautifulsoup.

from bs4 import BeautifulSoup
import requests
import pandas as pd
import dateutil
from datetime import datetime

espn_page = requests.get('https://www.espn.co.uk/nfl/fixtures/_/week/2/seasontype/1')
soup = BeautifulSoup(espn_page.content, 'html.parser')
espn_schedule = soup.find('div', {'class': 'main-content'})
for td in espn_schedule.find_all('td', {'data-behavior': 'date_time'}):
    utc = dateutil.parser.parse(td.get('data-date'))
    localtime = utc.astimezone(dateutil.tz.gettz())
    td.string = localtime.strftime("%I:%M")

df = pd.read_html(str(espn_schedule))
print(df[0].columns)
print(df[0][df[0].columns[2]])

0voto

gosci Points 49

Votre code fonctionne parfaitement, mais j'ai plutôt besoin du texte contenu après l'élément 'href', qui est '6:00 PM' :

J'ai donc modifié votre code comme ceci :

for td in espn_schedule.find_all('a', {'data-dateformat': 'time1'}):
    td.string = td.get('href')

Et j'arrive à l'élément que je veux, mais je ne sais pas comment extraire le texte qui suit (qui est '6:00 PM'). Comment puis-je le faire ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X