Изображение "src" текстового лома и скрапа с веб-страницы с помощью Beautifulsoup - PullRequest
0 голосов
/ 05 апреля 2019

Я пытаюсь перебрать эту страницу

Есть 2 проблемы с ним:

1) Я пытаюсь получить данные из таблицы, которая присутствует. Информация о пакете вкладка, но я не получаю никакого результата. Мой путь селектора правильный, но выходной сигнал не появляется. Требуемые выходные данные приведены ниже:

2) Хотя я получаю текст "src" изображения, я не получаю требуемый текст, который используется для изображений. Требуемый выход ниже.

import requests
from bs4 import BeautifulSoup


result = []

response = requests.get("https://www.ikea.com/sa/en/catalog/products/00361049/")
assert response.ok
page = BeautifulSoup(response.text, "html.parser")

for record in page.find_all('.packages-specification-table tr:last-child'):
   for data in record.find_all('td'):
      print(data.text)

for record1 in page.find_all('.packages-specification-table tr:first-child'):
   for data1 in record1.find_all('th'): 
      print(data1)  
for des in page.find_all('img'):
   image= des.get('src')
   print(image)

Требуемый вывод таблицы:

Артикул 00361049

Пакеты 1

Ширина 74 см

Высота 48 см

Длина 106 см

Диаметр -

Вес 30,00 кг

Требуется вывод изображения src:

/ PIAimages / 0618875_PE688687_S1.JPG

/ PIAimages / 0325432_PE517964_S1.JPG

/ PIAimages / 0690287_PE723209_S1.JPG

/ PIAimages / 0513996_PE639275_S1.JPG

/ PIAimages / 0325450_PE517970_S1.JPG

1 Ответ

0 голосов
/ 05 апреля 2019

Эта страница использует JavaScript для загрузки данных.

Этот код получает URL для изображений.

import requests

url = 'https://www.ikea.com/sa/en/iows/catalog/products/?catalog=departments&category=10687&type=json&dataset=small,allImages,prices&count=11&sort=relevance&sortorder=ascending&startIndex=0'

r = requests.get(url)

data = r.json()

for item in data['products']:
    print(item['item']['name'])
    for image in item['item']['images']['large']:
        print(image)

Другая информация может быть в других файлах, загружаемых JavaScript.

Вы можете найти их в DevTools в Chrome / Firefox - вкладка: Сеть, фильтр: XHR


EDIT:

Эта страница использует JavaScript, но BS не запускает JavaScrit.

Когда я отключаю JavaScript в веб-браузере, я вижу элементы в других тегах, а не в вашем коде.

import requests
from bs4 import BeautifulSoup

r = requests.get("https://www.ikea.com/sa/en/catalog/products/00361049/")

soup = BeautifulSoup(r.text, "html.parser")

html = soup.select('div#productDimensionsContainer div#metric')[0].encode_contents().decode().strip()
data = list(filter(None, html.split('<br/>')))
print(data)

# ['Width: 82 cm', 'Depth: 96 cm', 'Height: 101 cm', 'Seat width: 49 cm', 'Seat depth: 54 cm', 'Seat height: 45 cm']

html = soup.select('div#custMaterials')[0].encode_contents().decode().strip()
data = list(filter(None, html.split('<br/>')))
print(data)

# ['Total composition: 100% polyester', 'Frame: Solid wood, Plywood, Particleboard, Polyurethane foam 25 kg/cu.m., Polyurethane foam 35 kg/cu.m., Polyester wadding', 'Seat cushion: Polyurethane foam 35 kg/cu.m., Polyester wadding', 'Leg: Solid beech, Clear lacquer']

EDIT:

Существует также <script> с var jProductData=... и информация из таблицы.

import requests
from bs4 import BeautifulSoup
import json

r = requests.get("https://www.ikea.com/sa/en/catalog/products/00361049/")
soup = BeautifulSoup(r.text, "html.parser")

# var jProductData = {"product":{"items": ... }};

all_scripts = soup.select('script')

for script in all_scripts:
    script = script.encode_contents().decode().strip()
    if 'var jProductData' in script:
        for row in script.split('\n'):
            if 'var jProductData' in row:
                data = json.loads(row.strip()[19:-1])
                for item in data['product']['items']:
                    #print(item['pkgInfoArr'][0])
                    print('articleNumber:', item['pkgInfoArr'][0]['articleNumber'])
                    print('weightMet:', item['pkgInfoArr'][0]['pkgInfo'][0]['weightMet'])
                    print('widthMet:', item['pkgInfoArr'][0]['pkgInfo'][0]['widthMet'])
                    print('quantity:', item['pkgInfoArr'][0]['pkgInfo'][0]['quantity'])
                    print('consumerPackNo:', item['pkgInfoArr'][0]['pkgInfo'][0]['consumerPackNo'])
                    print('lengthMet:', item['pkgInfoArr'][0]['pkgInfo'][0]['lengthMet'])
                    print('heightMet:', item['pkgInfoArr'][0]['pkgInfo'][0]['heightMet'])
                    print('---')

Результат:

articleNumber: 20343224
weightMet: 30.40 kg
widthMet: 74 cm
quantity: 1
consumerPackNo: 1
lengthMet: 106 cm
heightMet: 48 cm
---
articleNumber: 00361049
weightMet: 30.00 kg
widthMet: 74 cm
quantity: 1
consumerPackNo: 1
lengthMet: 106 cm
heightMet: 48 cm
---
articleNumber: 90361894
weightMet: 29.70 kg
widthMet: 74 cm
quantity: 1
consumerPackNo: 1
lengthMet: 106 cm
heightMet: 47 cm
---
articleNumber: 80359844
weightMet: 30.00 kg
widthMet: 74 cm
quantity: 1
consumerPackNo: 1
lengthMet: 106 cm
heightMet: 53 cm
---
articleNumber: 40359855
weightMet: 31.00 kg
widthMet: 75 cm
quantity: 1
consumerPackNo: 1
lengthMet: 106 cm
heightMet: 49 cm
---
articleNumber: 10413953
weightMet: 29.90 kg
widthMet: 74 cm
quantity: 1
consumerPackNo: 1
lengthMet: 106 cm
heightMet: 47 cm
---
articleNumber: 40433247
weightMet: 29.90 kg
widthMet: 74 cm
quantity: 1
consumerPackNo: 1
lengthMet: 106 cm
heightMet: 47 cm
---

Возможно, есть другая информация, такая как URL-адреса для изображений, но я не копался в var jProductData, чтобы найти ее.

...