Получить текст элементов внутри выпадающего списка xpath - PullRequest
0 голосов
/ 20 января 2020

У меня есть такой выбор

<select name="super_attribute[93]" data-selector="super_attribute[93]" data-validate="{required:true}" id="attribute93" class="super-attribute-select" aria-required="true">
<option value="">Choose an Option...</option>
<option value="131">Green</option>
<option value="20364">Black</option>
<option value="20365">White</option></select>

Я хочу получить текст элементов из выпадающего списка (зеленый, черный, белый), используя селектор CSS или Xpath

Я попробовал следующее

response.xpath("//*[(@id = 'attribute93')]").extract()

, по какой-то причине он вернул только первое значение

[u'<select name="super_attribute[93]" data-selector="super_attribute[93]" data-validate="{required:true}" id="attribute93" class="super-attribute-select"><option value="">Choose an Option...</option></select>']

Ответы [ 3 ]

2 голосов
/ 20 января 2020

Xpath:

//select[@id="attribute93"]/option[position()>1]/text()
0 голосов
/ 20 января 2020

Вы выбираете не элементы option, которых несколько, а элемент select. Во входном документе отображается только один select элемент.

>>> from scrapy.selector import Selector
>>> body = """<select name="super_attribute[93]" data-selector="super_attribute[93]" data-validate="{required:true}" id="attribute93" class="super-attribute-select" aria-required="true">
... <option value="">Choose an Option...</option>
... <option value="131">Green</option>
... <option value="20364">Black</option>
... <option value="20365">White</option></select>"""
>>> response = Selector(text=body)
>>> response.xpath("//*[(@id = 'attribute93')]").extract()
['<select name="super_attribute[93]" data-selector="super_attribute[93]" data-validate="{required:true}" id="attribute93" class="super-attribute-select" aria-required="true">\n<option value="">Choose an Option...</option>\n<option value="131">Green</option>\n<option value="20364">Black</option>\n<option value="20365">White</option></select>']

Вывод представляет собой список с одним единственным элементом, но это не то, что вы опубликовали в своем вопросе (в наименьшее с scrapy 1.8.0): все дочерние элементы option включены.

Использование правильного выражения XPath из этого существующего ответа :

>>> response.xpath('//select[@id="attribute93"]/option[position()>1]/text()').extract()
['Green', 'Black', 'White']
0 голосов
/ 20 января 2020

Чтобы выбрать все <options>, ваш запрос CSS будет:

select#attribute93 option
...