2017-02-02 4 views
1

Я пытаюсь извлечь конкретные данные о ценах с помощью scrapy, но цена не обернута в тег.Scrap extract non-wrapped data

Как я могу составить цену из этого html?

<div class="value"> 
     <span class="currency">€</span> 
    39 
    <span class="decimal">.98</span> 
    <span class="type">New</span> 
</div> 

Как усовершенствовать это до 39,98?

Решение используется:

"".join(response.xpath("//section[@class='order order--new order--left']//div[@class='spec price']//div[@class='value']//text()").re("[0-9.]+")) 
+0

Добро пожаловать в StackOverflow! Пожалуйста, найдите минутку, чтобы просмотреть наш [тур] (http://stackoverflow.com/tour). – Tavrock

ответ

2

Получить все текстовые узлы внутри элемента и присоединиться:

$ scrapy shell file://$PWD/index.html 
In [1]: "".join(response.xpath("//div[@class = 'value']//text()").re("[0-9.]+")) 
Out[1]: u'39.98' 

.re() помогает фильтровать только цифры и точки.

Если есть несколько значений в документе:

In [2]: ["".join(value.xpath(".//text()").re(r"[0-9.]+")) for value in response.xpath("//div[@class = 'value']")] 
Out[2]: [u'39.98'] 
+0

Спасибо, это отлично работает. Но что, если в одном документе есть несколько классов значений? Мой вывод «'24 .9810019.9810024.9819.98 '' теперь, потому что есть другие классы значений с цифрами. – jef

+0

@jef уверен, обновил ответ. – alecxe

+0

Спасибо, но я имел в виду, если в документе есть несколько классов значений, но мне нужен только один конкретный. Некоторые дают другие значения, чем цены (номера телефонов ...) Я сузил его, чтобы получить правильный класс значений. Надеюсь, он по-прежнему эффективен: '" ".join (response.xpath (" // section [@ class = 'order order - new order - left'] // div [@ class = 'spec price'] //div[@class='value']//text()").re("[0-9.]+ "))' – jef