div возвращает пустое значение при очистке цены с помощью BeautifulSoup, все остальное, как заголовок, ссылки на изображения возвращают значение. Почему это происходит? - PullRequest
0 голосов
/ 04 января 2019

Мне нужна цена товара.Я иду заголовок, ссылка на изображение.Я хочу знать, почему div возвращает пустой, а div - нет?

import requests, bs4, math
import urllib.request

res = requests.get('https://www.zara.com/ca/en/turtleneck-sweater-p07148300.html?v1=8389726&v2=1179974', 

headers={'User-agent': 'Mozilla/5.0 Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36'})

zara = bs4.BeautifulSoup(res.text,'html.parser')

price = zara.find('div', attrs={'class':"price _product-price"})

print(price)`

возвращает

<div class="price _product-price" data-qa-qualifier="product-price" tabindex="0"> </div> 

Где div имеет

<div class="price _product-price" tabindex="0" data-qa-qualifier="product-price">
<span>49.90 CAD</span>
</div>

1 Ответ

0 голосов
/ 04 января 2019

ОПЦИЯ 1:

Таблица сгенерирована Javascript, но в источнике страницы есть данные JSON для этой таблицы.

Чтобы получить данные, которые вы можете использоватьBeautifulSoup и JSON.Я также использовал регулярные выражения и включил больше данных.Это будет проходить по каждому продукту, но если вы заметите, что цены и размеры не меняются, просто возьмите первый экземпляр вместо итерации.

import requests
import bs4
import json
import re

res = requests.get('https://www.zara.com/ca/en/turtleneck-sweater-p07148300.html?v1=8389726&v2=1179974', 
headers={'User-agent': 'Mozilla/5.0 Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36'})

zara = bs4.BeautifulSoup(res.text,'html.parser')

scripts = zara.find_all('script')
jsonObj = None

for script in scripts:
    if '@context' in script.text:
        jsonStr = script.text
        jsonObj = json.loads(jsonStr)

for product in jsonObj:
    name = product['name']
    sku = product['sku']
    price = product['offers']['price']
    availabililty = product['offers']['availability'].split('/')[-1]
    availabililty = [s for s in re.split("([A-Z][^A-Z]*)", availabililty) if s]
    availabililty = ' '.join(availabililty)

    print('Name: %s   SKU: %s   Price: %0.2f  Availability: %s' %(name, sku, float(price), availabililty))

Вывод:

Name: TURTLENECK SWEATER   SKU: 8389726-809-3   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-809-4   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-809-5   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-809-6   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-250-3   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-250-4   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-250-5   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-250-6   Price: 49.90  Availability: Out Of Stock
Name: TURTLENECK SWEATER   SKU: 8389726-401-3   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-401-4   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-401-5   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-401-6   Price: 49.90  Availability: Out Of Stock
Name: TURTLENECK SWEATER   SKU: 8389726-800-3   Price: 49.90  Availability: Out Of Stock
Name: TURTLENECK SWEATER   SKU: 8389726-800-4   Price: 49.90  Availability: In Stock
Name: TURTLENECK SWEATER   SKU: 8389726-800-5   Price: 49.90  Availability: Out Of Stock
Name: TURTLENECK SWEATER   SKU: 8389726-800-6   Price: 49.90  Availability: Out Of Stock

ВАРИАНТ 2:

Поскольку страница является динамической, используйте Selenium для имитации открытия браузера, позволяющего странице визуализироваться, а затем возьмитеhtml.

import bs4 
from selenium import webdriver 

url = 'https://www.zara.com/ca/en/turtleneck-sweater-p07148300.html?v1=8389726&v2=1179974'

browser = webdriver.Chrome('C:\chromedriver_win32\chromedriver.exe')
browser.get(url)

res = browser.page_source
zara = bs4.BeautifulSoup(res,'html.parser')  

price = zara.find('div', attrs={'class':"price _product-price"})

print(price)

browser.close()

Вывод:

print(price)
<div class="price _product-price" data-qa-qualifier="product-price" tabindex="0"><span>49.90 CAD</span></div>

или получить только цену без тегов:

print(price.text)
49.90 CAD

OPTION3:

Использование пакета запросы-html Похоже, что он может захватывать некоторый текст, который отображается с помощью JavaScript, но я никогда не использовал его, поскольку он конфликтует с ноутбуками jupyter и Spyderкоторый я использую регулярно, поэтому я получаю ошибки (и я был в порядке с использованием Selenium в прошлом).Так что вы сами можете попробовать это, но ниже приведен пример из документов.

from requests_html import HTMLSession
session = HTMLSession()

r = session.get('http://python-requests.org/')

r.html.render()

r.html.search('Python 2 will retire in only {months} months!')['months']

Вывод:

'<time>25</time>'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...