bs4 анализирует другой HTML чем браузер - PullRequest
0 голосов
/ 22 декабря 2019

Я пытаюсь очистить16, пока я не могу найти те же компоненты (теги или текст в целом), что и текст , обработанный (сброшен) (https://www.farfetch.com/ch/shopping/men/sale/all/items.aspx?page=1&view=180&scale=282) с помощью Beautifulsoup4). в soup.html) как в браузере в представлении dev tools (при поиске подходящих строк с помощью CTRL + F).

В моем коде нет ничего плохого, кроме как здесь:

#!/usr/bin/python 
# imports
import bs4
import requests
from bs4 import BeautifulSoup as soup

# parse website
url = 'https://www.farfetch.com/ch/shopping/men/sale/all/items.aspx?page=1&view=180&scale=282'
response = requests.get(url)
page_html = response.text
page_soup = soup(page_html, "html.parser")

# write parsed soup to file
with open("soup.html", "a") as dumpfile:
    dumpfile.write(str(page_soup))

Когда я перетаскиваю файл soup.html в браузер, все содержимое загружается как должно (например, реальный URL). Я предполагаю, что это какая-то защита от разбора? Я пытался установить соединениезаголовок, который сообщает веб-серверу на другой стороне, что я запрашиваю это у реального браузера, но он тоже не работает.

  1. Кто-нибудь сталкивался с чем-то подобным раньше?
  2. Есть ли способполучить НАСТОЯЩИЙ HTML, как показано в браузере?

Когда я ищу нужный контент в браузере, он (очевидно) появляется ...

enter image description here

Здесь парсРед HTML сохранен как "soup.html". Содержимое, которое я ищу, не может быть найдено, независимо от как Я ищу (CTRL + F) или функции bs4 find_all () или find () или чего-либо еще.

the parsed content is not the same as the content displayd in the browser

1 Ответ

1 голос
/ 22 декабря 2019

Исходя из вашего комментария, вот пример того, как вы можете извлечь некоторую информацию из продуктов со скидкой:

import requests
from bs4 import BeautifulSoup

url = "https://www.farfetch.com/ch/shopping/men/sale/all/items.aspx?page=1&view=180&scale=282"

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

for product in soup.select('[data-test="productCard"]:has([data-test="discountPercentage"])'):

    link = 'https://www.farfetch.com' + product.select_one('a[itemprop="itemListElement"][href]')['href']
    brand = product.select_one('[data-test="productDesignerName"]').get_text(strip=True)
    desc = product.select_one('[data-test="productDescription"]').get_text(strip=True)
    init_price = product.select_one('[data-test="initialPrice"]').get_text(strip=True)
    price = product.select_one('[data-test="price"]').get_text(strip=True)
    images = [i['content'] for i in product.select('meta[itemprop="image"]')]

    print('Link          :', link)
    print('Brand         :', brand)
    print('Description   :', desc)
    print('Initial price :', init_price)
    print('Price         :', price)
    print('Images        :', images)
    print('-' * 80)

Отпечатки:

Link          : https://www.farfetch.com/ch/shopping/men/dashiel-brahmann-printed-button-up-shirt-item-14100332.aspx?storeid=9359
Brand         : Dashiel Brahmann
Description   : printed button up shirt
Initial price : CHF 438
Price         : CHF 219
Images        : ['https://cdn-images.farfetch-contents.com/14/10/03/32/14100332_22273147_300.jpg', 'https://cdn-images.farfetch-contents.com/14/10/03/32/14100332_22273157_300.jpg']
--------------------------------------------------------------------------------
Link          : https://www.farfetch.com/ch/shopping/men/dashiel-brahmann-corduroy-t-shirt-item-14100309.aspx?storeid=9359
Brand         : Dashiel Brahmann
Description   : corduroy T-Shirt
Initial price : CHF 259
Price         : CHF 156
Images        : ['https://cdn-images.farfetch-contents.com/14/10/03/09/14100309_21985600_300.jpg', 'https://cdn-images.farfetch-contents.com/14/10/03/09/14100309_21985606_300.jpg']
--------------------------------------------------------------------------------

... and so on.
...