BeautifulSoup findAll () не показывает каждый тег - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь обрезать каждое изображение на странице 9gag.com/hot для образовательных целей, я изучаю python и webscrapping. Вот мой код в очень простом формате:

import requests, os, bs4

url = 'https://9gag.com/hot'            
os.makedirs('9gag', exist_ok=True)   

print('Downloading page %s...' % url)

res = requests.get(url)
res.raise_for_status()
soup = bs4.BeautifulSoup(res.text, 'html.parser')
find = soup.findAll("img")

print(find)

А вот HTML-файл, над которым я работаю:

printscreen

И у меня есть проблема с пониманием того, как именно работает findAll () или другой метод супа, потому что, когда я запускал этот код, теги не были найдены, хотя их много. Я не знаю точно, как мне найти что-то: через тег, через тег и класс этого, по родителю или как?

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Как уже было сказано, контент загружается динамически.Вы можете использовать запросы_html , который поддерживает JavaScript вместо запросов.

import requests, os, bs4
from requests_html import HTMLSession

url = 'https://9gag.com/hot'            
os.makedirs('9gag', exist_ok=True)   

print('Downloading page %s...' % url)
session = HTMLSession()
r = session.get(url)
r.html.render()

find = r.html.find("img")

print(find)

Это дает вам что-то вроде этого:

[<Element 'img' alt='Avatar' id='jsid-avatar' src=''>, <Element 'img' loading='lazy' src='https://miscmedia-9gag-fun.9cache.com/images/thumbnail-facebook/1557283905.6809_vudeXy_100x100.jpg'>, <Element 'img' loading='lazy' src='https://miscmedia-9gag-fun.9cache.com/images/thumbnail-facebook/1557376304.186_U5U7u5_100x100.jpg'>,..]
0 голосов
/ 11 июля 2019

Вы не видите никаких тегов <img>, потому что страница загружает содержимое динамически, через AJAX. Если вы откроете инструменты разработчика в Firefox или Chrome, вы увидите, что основной контент загружается через JSON с другого URL:

import requests, json

url = 'https://9gag.com/v1/featured-posts'

print('Downloading page %s...' % url)
res = requests.get(url)
res.raise_for_status()
data = res.json()
print(json.dumps(data, indent=4))

Печать:

Downloading page https://9gag.com/v1/featured-posts...
{
    "meta": {
        "timestamp": 1562836411,
        "status": "Success",
        "sid": "9gVQ01EVjlHTUVkMMRVT1wEVFVTTn1TY"
    },
    "data": {
        "items": [
            {
                "itemId": "27568",
                "title": "The Corgi Who Plays Cheddar On Brooklyn Nine-Nine Has Passed Away",
                "url": "https://9gag.com/gag/adLm8rZ",
                "imageURL": "https://miscmedia-9gag-fun.9cache.com/images/featured/1562834921.0526_hYra9u_300.jpg",
                "upVoteCount": 19,
                "commentsCount": 12
            },
            {
                "itemId": "27566",
                "title": "Star Wars Reveals First Look At Sith Trooper For 'The Rise Of Skywalker'",
                "url": "https://9gag.com/gag/aZLGyEW",
                "imageURL": "https://miscmedia-9gag-fun.9cache.com/images/featured/1562833129.2422_NUTeny_300.jpg",
                "upVoteCount": 21,
                "commentsCount": 26
            },

... and so on.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...