1
votes

Impossible de récupérer les données de table à l'aide de BeautifulSoup à partir d'un site Web

Je suis un tutoriel en ligne ( https://www.analyticsvidhya.com/blog/2015/10/beginner-guide-web-scraping-beautiful-soup-python/ ) pour le web scraping d'une table html. Lorsque j'ai suivi le didacticiel, j'ai pu extraire les données de la table, mais j'ai essayé de récupérer les données à partir de celui-ci ( https://www.masslottery.com/games/lottery/search/results-history.html?game_id= 15 & mode = 2 & selected_date = 2019-03-04 & x = 12 & y = 11 ) site Web Je n'ai pas pu le faire.

J'ai déjà essayé d'utiliser scrapy mais j'ai obtenu les mêmes résultats.

Voici le code que j'ai utilisé.

<table cellspacing="0" class="zebra-body-only"                                  <tbody id="target-area">
<tr class="odd">
<th>Draw #</th>
<th>Draw Date</th>
<th>Winning Number</th>
<th>Bonus</th>
</tr>
<tr><td>2107238</td>
<td>03/04/2019</td>
<td>01-04-05-16-23-24-27-32-34-41-42-44-47-49-52-55-63-65-67-78</td><td>No Bonus</td>
</tr>
<tr class="odd">
<td>2107239</td>
<td>03/04/2019</td>
<td>04-05-11-15-19-20-23-24-25-28-41-45-52-63-64-68-71-72-73-76</td><td>4x</td>
</tr> 
....(And so on)

C'est ce que j'obtiens quand j'exécute ce code sur le terminal

<table cellspacing="0" class="zebra-body-only">
<tbody id="target-area">
</tbody>
</table>

Bien que quand J'inspecte le site Web de la loterie de masse en utilisant google chrome c'est ce que je vois

import urllib.request

wiki = "https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11"
page = urllib.request.urlopen(wiki)
from bs4 import BeautifulSoup
soup = BeautifulSoup(page, "lxml")


all_tables=soup.find_all('table')


right_table=soup.find('table', class_='zebra-body-only')
print(right_table)

Je veux pouvoir extraire les données de ce tableau.


0 commentaires

3 Réponses :


1
votes

Cela se produit parce que le site Web effectue un autre appel pour charger les résultats. Le lien initial ne charge que la page mais pas les résultats. En utilisant les outils de développement Chrome pour inspecter les demandes, vous serez en mesure de trouver la demande que vous devez répliquer pour obtenir les résultats.

Cela signifie que pour obtenir les résultats, vous pouvez simplement appeler la requête mentionnée ci-dessus et ne pas avoir à appeler la page Web du tout.

Heureusement, le point de terminaison que vous devez appeler est déjà dans un bon format JSON.

GET https://www.masslottery.com/data/json/search/dailygames/history/15/201903.json?_=1555083561238

Où je suppose que 1555083561238 est l'horodatage.


2 commentaires

Et comment appeler ce point de terminaison? Désolé, je suis vraiment nouveau dans ce domaine.


puisqu'il s'agit d'une requête GET, remplacez simplement votre variable "wiki" par cette URL à la place. Vous voudrez peut-être consulter le package de requêtes python car il est plus détaillé pour appeler diverses URL avec différentes méthodes (GET, PUT, POST, etc.)



0
votes

La page est dynamique, elle est donc rendue après que vous ayez fait la demande. Vous pouvez soit a) utiliser la solution par JC1 et accéder à la réponse json. Ou vous pouvez utiliser Seleneium pour simuler l'ouverture du navigateur, le rendu de la page, puis la saisie de la table:

import pandas as pd
from selenium import webdriver


url = 'https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11'  

driver = webdriver.Chrome()
driver.get(url)
page = driver.page_source

# will return a list of dataframes
tables = pd.read_html(page)

# chose the dataframe you want from the list by it's position
df = tables[0]

Aussi en remarque: généralement si je vois

code > balises, je vais laisser Pandas faire le travail à ma place (notez que je suis bloqué pour accéder au site, je ne peux donc pas les tester):
from bs4 import BeautifulSoup
from selenium import webdriver


url = 'https://www.masslottery.com/games/lottery/search/results-history.html?game_id=15&mode=2&selected_date=2019-03-04&x=12&y=11'  

driver = webdriver.Chrome()
driver.get(url)
page = driver.page_source

soup = BeautifulSoup(page, "lxml")

all_tables=soup.find_all('table')


right_table=soup.find('table', class_='zebra-body-only')


0 commentaires

0
votes

oui, je sauvegarderais les données que vous obtenez dans un fichier pour voir si ce que vous recherchez est vraiment là. avec open ('stuff.html', 'w') comme f: f.write (response.text)

unicode, essayez: importer des codecs codecs.open (fp, 'w', 'utf-8') comme f:

si vous ne voyez pas ce que vous cherchez là-bas, vous devrez trouver la bonne URL à charger, vérifiez les options du développeur Chrome c'est généralement difficile

La solution la plus simple consiste à utiliser du sélénium assurez-vous d'attendre que ce que vous recherchez apparaisse sur la page (c'est dynamique)


0 commentaires