Почему мой селектор CSS не работает с BeautifulSoup, но отлично работает как запрос консоли Chrome?

У меня есть селектор css, который отлично работает при его выполнении в консоли Chrome JS, но не работает при запуске через BeautifulSoup в одном примере, но работает в другом (я не могу различить разницу между ними).

url_1 = 'https://www.amazon.com/s?k=bacopa&page=1'
url_2 = 'https://www.amazon.com/s?k=acorus+calamus&page=1'

Следующий запрос отлично работает в обоих случаях при выполнении в консоли Chrome.

document.querySelectorAll('div.s-result-item') 

Затем запустив два URL-адреса через BeautifulSoup, я получаю вот такой результат.

url_1 (работает)

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
r = requests.get(url_1, headers=headers)
soup = BeautifulSoup(r.content, 'html.parser')
listings = soup .select('div.s-result-item')
print(len(listings))

вывод: 53 (правильно)

url_2 (не работает)

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'}
r = requests.get(url_2, headers=headers)
soup = BeautifulSoup(r.content, 'html.parser')
listings = soup.select('div.s-result-item')
print(len(listings))

вывод: 0 (неверно - ожидаемо: 49)

Кто-нибудь знает, что здесь может происходить и как я могу заставить селектор css работать с BeautifulSoup?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 303
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте selenium library загрузить веб-страницу

from selenium import webdriver
from bs4 import BeautifulSoup

url_1 = 'https://www.amazon.com/s?k=bacopa&page=1'
url_2 = 'https://www.amazon.com/s?k=acorus+calamus&page=1'

#set chrome webdriver path
driver = webdriver.Chrome('/usr/bin/chromedriver')

#download webpage
driver.get(url_2)

soup = BeautifulSoup(driver.page_source, 'html.parser')
listings = soup.find_all('div',{'class':'s-result-item'})

print(len(listings))

О/П:

url_1: 50

url_2 : 48

@gloomyfit selenium работает медленно, потому что загружает все, что связано со страницей веб-сайта.

bharatk 30.05.2019 11:03
Ответ принят как подходящий

Я думаю, что это html. Измените парсер на «lxml». Вы также можете сократить свой селектор css до класса и повторно использовать соединение с объектом Session для повышения эффективности.

import requests
from bs4 import BeautifulSoup as bs

urls = ['https://www.amazon.com/s?k=bacopa&page=1','https://www.amazon.com/s?k=acorus+calamus&page=1']

with requests.Session() as s:
    for url in urls:
        r = s.get(url, headers = {'User-Agent' : 'Mozilla/5.0'})
        soup = bs(r.content, 'lxml')
        listings = soup.select('.s-result-item')
        print(len(listings))

Другие вопросы по теме