#python #xpath
#python #xpath
Вопрос:
Я пытаюсь получить цены с веб-сайтов и сталкиваюсь с проблемой, что иногда они добавляют дополнительный текст в поле.
например
<span class="price--content content--default">
Ihr Preis:
13.815,00amp;nbsp;€
</span>
>>> response.xpath('//span[@class="price--content content--default"]/text()').extract()
['n', 'n', 'nIhr Preis:n13.815,00xa0€n']
Другой пример здесь:
<span class="price--content content--default">
Jetzt:
5.765,00amp;nbsp;€
</span>
Как я могу убедиться, что xpath получает число во всех случаях, даже если текста нет, а есть только число?
В качестве альтернативы, если это невозможно, как я могу получить первый номер списка с помощью python?
Ответ №1:
Вы можете сделать это даже с выражением XPath 1.0, при условии, что существует одно и только одно число, а используемый вами модуль python может обрабатывать типы данных результатов, отличные от набора узлов. Используйте:
translate(
//span[@class="price--content content--default"],
translate(//span[@class="price--content content--default"],'0123456789.,',''),
'')
Ответ №2:
Вы можете найти их с помощью регулярного выражения. Например,
import re
string1 = 'nIhr Preis:n13.815,00xa0€n'
string2 = 'nIhr Preis:n5.765,00amp;nbsp;€xa0€n'
my_num = re.findall(r'd .d ', string1) # or string2
print(my_num)
Комментарии:
1. Возможно, сначала нужно присоединиться к списку, верно? Что-то вроде этого? re.findall(r’ d ‘, «.join([remove_tags(w).strip().replace(‘.’, «).replace(‘,00’, «) для w в ответе.xpath(‘//span[@class=»цена-содержимое содержимого-по умолчанию»]/text()’).extract()]))
2. @merlin 1 да
Ответ №3:
Поскольку вы ищете цену, проблема в том, что, предположительно, вам нужно извлечь всю цену, включая центы (или любой эквивалент для данной валюты). Итак, слегка изменив ваш второй пример:
my_str = '<span class="price--content content--default">Jetzt:5.765,12amp;nbsp;€</span>'
Вывод должен быть целым 5.765,12
. Итак, без использования регулярных выражений я бы предложил:
for char in my_str:
if char.isdigit() or char =='.' or char==',':
print(char, end ="")
Вывод:
5.765,12