J'essaie de gratter 2 tableaux d'une page Web simultanément. BeautifulSoup ne trouve pas le premier tableau sans problème, mais peu importe ce que j'essaie, il ne peut pas trouver le deuxième tableau, voici la page Web: Référence Hockey: Justin Abdelkader.

C'est le tableau sous l'en-tête Playoffs.

Voici mon code.

        sauce = urllib.request.urlopen('https://www.hockey-reference.com/players/a/abdelju01/gamelog/2014', timeout=None).read()
        soup = bs.BeautifulSoup(sauce, 'html5lib')
        table = soup.find_all('table')
        print(len(table))

Qui imprime toujours 1.

Si j'imprime (soupe) et utilise la fonction de recherche dans mon terminal, je peux localiser 2 balises de table distinctes. Je ne vois aucun javascript qui empêcherait BS4 de trouver la balise. J'ai également essayé de trouver la table par id et classe, même le div parent de la table semble impossible à trouver. Quelqu'un a-t-il une idée de ce que je pourrais faire de mal?

0
Cooper Dean 27 janv. 2019 à 00:53

3 réponses

Meilleure réponse

En raison du chargement par javascript d'informations supplémentaires

Aujourd'hui, requests_html peut se charger avec la page html et le contenu javascript.

pip install requests-html

from requests_html import HTMLSession
session = HTMLSession()
r = session.get('https://www.hockey-reference.com/players/a/abdelju01/gamelog/2014')
r.html.render()
res = r.html.find('table')
print(len(res))
4
2
Valery Ramusik 26 janv. 2019 à 22:45

Vous pouvez accéder à la ligne de commentaires avec bs4 Commentaire comme:

from bs4 import BeautifulSoup , Comment
from urllib import urlopen


search_url = 'https://www.hockey-reference.com/players/a/abdelju01/gamelog/2014'

page = urlopen(search_url)
soup = BeautifulSoup(page, "html.parser")

table = soup.findAll('table') ## html part with no comment
table_with_comment = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in table_with_comment]
## print table_with_comment  print all comment line

start = '<table class'

for c in range(0,len(table_with_comment)):
    if start in table_with_comment[c]:
         print table_with_comment[c] ## print comment line has <table class 
1
Omer Tekbiyik 26 janv. 2019 à 23:08

Le deuxième tableau semble être à l'intérieur d'une balise de commentaire HTML <--... <table class=.... Je suppose que c'est pourquoi BeautifulSoup ne le trouve pas.

1
Frank Niessink 26 janv. 2019 à 22:12