2 votes

Difficultés d'accès aux données des tables avec beautifulsoup

C'est un peu embarrassant, mais j'essaie de récupérer des scores d'utilisateurs sur myanimelist et j'ai des problèmes.

Quand je regarde le html, il me semble qu'ils sont sous une balise "a" avec "class="link"". Mais lorsque j'essaie d'utiliser la méthode find ou find_all, je n'obtiens que de la merde.

J'ai également essayé de ne récupérer que le tableau "table class="list-table"." Cela me permet d'obtenir l'information que je veux, mais elle se trouve sous un élément data-items auquel je ne sais pas comment accéder.

from bs4 import BeautifulSoup
import requests

page_link = 'https://myanimelist.net/animelist/PankiePea?status=7' #my profile as an example
page_response = requests.get(page_link, timeout=10)

soup = BeautifulSoup(page_response.text, "html.parser")

scores = soup.find_all('a','link')

data-items thing

[<table class="list-table" data-items='[{"status":1,"score":6,"tags":"","is_rewatching":0,"num_watched_episodes":12,"anime_title":"One Punch Man 2nd Season","anime_num_episodes":12,"anime_airing_status":2,"anime_id"

0voto

Andrej Kesely Points 20452

Vous pouvez utiliser json.loads ( doc ) pour charger les données dans le data-items attribut :

import json
import requests
from bs4 import BeautifulSoup

url = 'https://myanimelist.net/animelist/PankiePea?status=7'

soup = BeautifulSoup(requests.get(url).text, 'lxml')

data = json.loads( soup.select_one('.list-table[data-items]')['data-items'] )   # load data from `data-items` attribute

# print data to the screen
print(json.dumps(data, indent=4))

Impressions :

[
    {
        "status": 1,
        "score": 6,
        "tags": "",
        "is_rewatching": 0,
        "num_watched_episodes": 12,
        "anime_title": "One Punch Man 2nd Season",
        "anime_num_episodes": 12,
        "anime_airing_status": 2,
        "anime_id": 34134,
        "anime_studios": null,
        "anime_licensors": null,
        "anime_season": null,
        "has_episode_video": true,
        "has_promotion_video": true,
        "has_video": true,
        "video_url": "/anime/34134/One_Punch_Man_2nd_Season/video",
        "anime_url": "/anime/34134/One_Punch_Man_2nd_Season",
        "anime_image_path": "https://cdn.myanimelist.net/r/96x136/images/anime/1805/99571.jpg?s=76893d6eb26f8add6731bcfa56f243ec",
        "is_added_to_list": false,
        "anime_media_type_string": "TV",
        "anime_mpaa_rating_string": "R",
        "start_date_string": null,
        "finish_date_string": null,
        "anime_start_date_string": "04-10-19",
        "anime_end_date_string": "07-03-19",
        "days_string": null,
        "storage_string": "",
        "priority_string": "Low"
    },
    {
        "status": 2,

... and so on.

EDIT : Pour localiser l'étiquette avec data-items nous utilisons le sélecteur CSS .list-table[data-items] - sélectionner la balise avec la classe list-table qui contient data-items attribut.

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