Как извлечь число с помощью xpath в python, если вокруг числа есть текст?

#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