Очистка значений выпадающего меню с помощью Python BeautifulSoup

#python #beautifulsoup #combobox #dropdown #screen-scraping

Вопрос:

Я проверил большинство сообщений, но не нашел ответа на свое небольшое предложение.

Это выпадающий список, который я хочу очистить:

 <div class="input-box">
    <select name="super_attribute[138]" id="attribute138" class="required-entry super-attribute select form-control" onchange="notifyMe(this.value, this.options[this.selectedIndex].innerHTML);">
        <option value="">Choose an Option...</option>
        <option value="17" price="0">M (in stock) </option>
        <option value="18" price="0">L (out of stock) </option>
        <option value="15" price="0">XL (in stock) </option>
        <option value="52" price="0">XXL (in stock) </option>
    </select>
</div>
 

Мой код на Python таков:

 items = soup.select('option[value]')
values = [item.get('value') for item in items]
textvalues = [item.text for item in items]

print(textvalues)
 

И результат таков :
[«выберите», «(В наличии)», » (В наличии)», «(В наличии)», «(В наличии)»]

Мой запрос заключается в том, что мне также нужны другие значения (значение размера и имя размера): 17 amp; M / 18 amp; L / 15 amp; XL / 52 amp; XXL

Если я удалил .text , у меня есть этот вывод:

    <option value="">select</option>, <option value="200@#-(In-Stock)@#-https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html@#-">(In-Stock)</option>, <option value="201@#-(Out-Stock)@#-https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html@#-">(Out-Stock)</option>, <option value="202@#-(In-Stock)@#-https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html@#-">(In-Stock)</option>, <option value="203@#-(In-Stock)@#-https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html@#-">(In-Stock)</option>
 

Заранее спасибо за вашу помощь.

Ответ №1:

Это довольно просто, просто добавьте , а также вызовите item.text в свой список-понимание.

Вместо:

 values = [item.get('value') for item in items]
 

использовать:

 values = [item.get('value')   item.get_text(strip=True) for item in items[1:]]
print(values)
 

ИЗМЕНИТЬ: Данные загружаются динамически, поэтому requests не поддерживают их. Но данные доступны в формате JSON на веб-сайте. Вы можете извлечь его с помощью регулярного выражения с помощью re модуля:

 import json
import re
import requests


url = "https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html"
response = requests.get(url).content

regex_pattern = re.compile(r"Product.Config(({.*?}));")
data = json.loads(regex_pattern.search(str(response)).group(1))

print(
    [
        product["id"]   product["label"]
        for product in data["attributes"]["138"]["options"]
    ]
)
 

Выход:

 ['17M (in stock) ', '18L (out of stock) ', '15XL (in stock) ', '52XXL (in stock) ']
 

Комментарии:

1. Спасибо за ваш ответ. Да, я пробовал это, но проблема в том, что вывод отличается, как показано ниже:

2. @TalalIsmail Каков URL-адрес? также не публикуйте такие сообщения в качестве ответа, вместо этого, в качестве комментария. (как ты только что сделал)

3. Хорошо, извините, это мой первый раз, когда я пришел к переполнению стека.

4. store.alsabihmarine.com/index.php/diving-equipments/wetsuits/…

5. Большое спасибо, теперь я понял, что это была динамическая ценность. Это отлично работает.

Ответ №2:

Спасибо за ваш ответ. Да, я пробовал это, но проблема в том, что вывод отличается, как показано ниже:

 ['200@#-(In-Stock)@#-https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html@#-(In-Stock)', '201@#-(Out-Stock)@#-https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html@#-(Out-Stock)', '202@#-(In-Stock)@#-https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html@#-(In-Stock)', '203@#-(In-Stock)@#-https://store.alsabihmarine.com/index.php/diving-equipments/wetsuits/camouflage-hooded-suits-220.html@#-(In-Stock)']