#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)']