Как я могу найти инвалидов с красивым супом? - PullRequest
0 голосов
/ 09 марта 2020

Я не могу найти отключенных на веб-странице: https://sport.woot.com/offers/asics-mens-clearance-calculator?ref=w_cnt_lnd_cat_sprt_18_1

<div class="attribute">
    <label for="attr-size">Size</label>

    <select id="attr-size" name="Size">
        <option value="none">- Select -</option>
        <option value="6.5">6.5</option>
        <option value="8">8</option>
        <option value="8.5" disabled="">8.5</option>
        <option value="9.5">9.5</option>
        <option value="10">10</option>
        <option value="10.5">10.5</option>
        <option value="11">11</option>
        <option value="12" disabled="">12</option>
        <option value="13" disabled="">13</option>
        <option value="14">14</option>
        <option value="12 Wide US">12 Wide US</option>
        <option value="13 (4E)" disabled="">13 (4E)</option>
    </select>
</div>

Я пробовал:

import requests
from bs4 import BeautifulSoup

result = requests.get("https://sport.woot.com/offers/asics-mens-clearance- 
calculator?ref=w_cnt_lnd_cat_sprt_18_1")
src = result.content
soup = BeautifulSoup(src, 'lxml')
print(soup.has_attr('disabled'))

и

import requests
from bs4 import BeautifulSoup

result = requests.get("https://sport.woot.com/offers/asics-mens-clearance- 
calculator?ref=w_cnt_lnd_cat_sprt_18_1")
src = result.content
soup = BeautifulSoup(src, 'lxml')
print(soup.get('option', {'value': 'disabled'}))

Я анализирую информацию с woot.com

1 Ответ

1 голос
/ 09 марта 2020

Эта страница использует JavaScript для установки отключенных элементов, но requests / BeautifulSoup не может работать JavaScript. Вам может понадобиться Selenium для управления веб-браузером, который может работать JavaScript.

ИЛИ вы можете попытаться получить URL, который JavaScript (AJAX / XHR) использует для получения данных с сервера.

Но эта страница не использует AJAX/XHR для загрузить информацию. В HTML я вижу скрипт с

var offerItems = [...] 

, который, вероятно, содержит всю информацию


Этот скрипт получает все 6-е <script> и обрезает 4-ю строку с var offerItems = ( Я нашел этот код проверки позиции вручную)

Затем он обрезает только текст с данными в [ ] и использует модуль json, чтобы преобразовать его в Python 'список / словарь.

Позже он может легко получить значения из этого списка / словаря.

Он содержит только информацию Size и Quantity, поэтому вам придется добавить код, который вычисляет, какие размеры отсутствуют, чтобы они можно отключить Я пропустил эту часть - я даже не пытался вычислить ее.

Кстати: некоторый код, который я написал в несколько строк, чтобы сделать его более читабельным, но вы можете написать его в одну строку.

import requests
from bs4 import BeautifulSoup
import json

response = requests.get("https://sport.woot.com/offers/asics-mens-clearance-calculator?ref=w_cnt_lnd_cat_sprt_18_1")
soup = BeautifulSoup(response.content, 'lxml')

all_scripts = soup.find_all('script')
#for i, item in enumerate(all_scripts):
#    print('---', i, '---')
#    print(item.text[:200])

text = all_scripts[5].text
lines = text.split('\n')
line = lines[3].strip()
line = line[len("var offerItems = "):-1]

data = json.loads(line)

#sizes = ["6.5", "8", "8.5", "9.5", "10", "10.5", "11", "12", "13", "14", "12 Wide US", "13 (4E)"]

print(data[0].keys())
for item in data:
    print('------------------------------------')
    print('Key:', item['Key'])
    print('Quantity:', item['Quantity'])
    for x in item['Attributes']:
        print('> ', x['Key'], ':', x['Value'])
    #for key, value in item.items():
    #    print('>', key, ':', value)

Результат:

dict_keys(['Id', 'Asin', 'AmazonPrice', 'Attributes', 'FormattedDiscount', 'FormattedListPrice', 'FormattedSalePrice', 'FormattedWarrantyPrice', 'Key', 'ListPrice', 'Quantity', 'SalePrice', 'SKU', 'TotalReviews', 'WarrantyPrice', 'WarrantyTerm', 'WarrantyUrl'])

------------------------------------
Key: 6.5|Gel-Nimbus 19 - Black/Onyx/Silver
Quantity: 10
>  Size : 6.5
>  Model : Gel-Nimbus 19 - Black/Onyx/Silver
------------------------------------
Key: 8|Gel-Excite 4 - Silver/Black/Imperial
Quantity: 6
>  Size : 8
>  Model : Gel-Excite 4 - Silver/Black/Imperial
------------------------------------
Key: 8|GT-2000 7 - Illusion Blue/Black
Quantity: 5
>  Size : 8
>  Model : GT-2000 7 - Illusion Blue/Black
------------------------------------
Key: 8|GT-2000 6 - Everglade/ Black
Quantity: 10
>  Size : 8
>  Model : GT-2000 6 - Everglade/ Black
------------------------------------
Key: 8.5|Frequent Trail - Black/ Birch
Quantity: 0
>  Size : 8.5
>  Model : Frequent Trail - Black/ Birch
------------------------------------
Key: 8.5|GT-2000 7 - Illusion Blue/Black
Quantity: 0
>  Size : 8.5
>  Model : GT-2000 7 - Illusion Blue/Black
------------------------------------
Key: 9.5|Gel-Venture 6 - Frost Grey/ Phantom/ Black
Quantity: 0
>  Size : 9.5
>  Model : Gel-Venture 6 - Frost Grey/ Phantom/ Black
------------------------------------
Key: 9.5|GT-2000 7 - Illusion Blue/Black
Quantity: 3
>  Size : 9.5
>  Model : GT-2000 7 - Illusion Blue/Black
------------------------------------
Key: 9.5|Gel-Nimbus 20 - Island Blue/White/Black
Quantity: 10
>  Size : 9.5
>  Model : Gel-Nimbus 20 - Island Blue/White/Black
------------------------------------
Key: 10|GT-2000 6 - Everglade/ Black
Quantity: 4
>  Size : 10
>  Model : GT-2000 6 - Everglade/ Black
------------------------------------
Key: 9.5|GT-2000 7 - Black/White
Quantity: 0
>  Size : 9.5
>  Model : GT-2000 7 - Black/White
------------------------------------
Key: 9.5|GT-2000 6 - Dark Grey/Black/Fiery Red
Quantity: 9
>  Size : 9.5
>  Model : GT-2000 6 - Dark Grey/Black/Fiery Red
------------------------------------
Key: 10|GT-2000 8 - Piedmont Grey/Black
Quantity: 3
>  Size : 10
>  Model : GT-2000 8 - Piedmont Grey/Black
------------------------------------
Key: 10|Gel-Contend 4 - Carbon/ Classic Red/ Black
Quantity: 6
>  Size : 10
>  Model : Gel-Contend 4 - Carbon/ Classic Red/ Black
------------------------------------
Key: 10.5|Gel-Excite 4 - Silver/Black/Imperial
Quantity: 10
>  Size : 10.5
>  Model : Gel-Excite 4 - Silver/Black/Imperial
------------------------------------
Key: 10.5|Gel-Excite 4 - Carbon/ Silver/ Black
Quantity: 0
>  Size : 10.5
>  Model : Gel-Excite 4 - Carbon/ Silver/ Black
------------------------------------
Key: 10.5|Gel-Nimbus 21 - Black/Classic Red
Quantity: 1
>  Size : 10.5
>  Model : Gel-Nimbus 21 - Black/Classic Red
------------------------------------
Key: 11|Gel-Nimbus 20 - Island Blue/White/Black
Quantity: 5
>  Size : 11
>  Model : Gel-Nimbus 20 - Island Blue/White/Black
------------------------------------
Key: 12|Gel-Nimbus 19 - Glacier Grey/Silver/White
Quantity: 0
>  Size : 12
>  Model : Gel-Nimbus 19 - Glacier Grey/Silver/White
------------------------------------
Key: 13|GT-1000 7 - Grand Shark/ Peacoat
Quantity: 0
>  Size : 13
>  Model : GT-1000 7 - Grand Shark/ Peacoat
------------------------------------
Key: 14|Gel-Cumulus 20 - Race Blue/ Peacoat
Quantity: 1
>  Size : 14
>  Model : Gel-Cumulus 20 - Race Blue/ Peacoat
------------------------------------
Key: 14|Gel-Nimbus 20 - Indigo blue/fiery red
Quantity: 0
>  Size : 14
>  Model : Gel-Nimbus 20 - Indigo blue/fiery red
------------------------------------
Key: 12 Wide US|Gel-Nimbus 20 - Black/White/Carbon
Quantity: 3
>  Size : 12 Wide US
>  Model : Gel-Nimbus 20 - Black/White/Carbon
------------------------------------
Key: Gel-Venture 6 - Frost Grey/ Phantom/ Black|13 (4E)
Quantity: 0
>  Model : Gel-Venture 6 - Frost Grey/ Phantom/ Black
>  Size : 13 (4E)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...