Почему мой селектор CSS не работает с Beautifulsoup, но отлично работает как запрос консоли Chrome? - PullRequest
0 голосов
/ 30 мая 2019

У меня есть 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?

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

Я думаю, что это 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))
0 голосов
/ 30 мая 2019

Попробуйте 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))

O / P:

url_1: 50

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