2015-10-20 1 views
3

Я строю скребок, чтобы получить цены на продукцию с веб-сайта.Scrapy: Невозможно удалить unicode из данных моего предмета (цена)

На данный момент у меня есть следующий код:

def parse(self, response): 
    for tank in response.xpath('//html/body/div/div[4]/div/div/div/table[1]/tr/td/div/span/span'): 
     item = VapeItem() 
     item["price"] = tank.xpath("text()").extract() 
     yield item 

А вот выход JSON:

{"price": ["5,00 \u20ac\n \n \n \n \n \n  *\n \n \n \n "]}, 

Я попытался кодирования ("UTF-8"), полоса, заменяет , но ничего не работает.

Мой вопрос: Как сделать вывод доступным для чтения. Либо сделайте «5,00 €» (\ u20ac), либо просто «5,00»

Заранее спасибо!

+0

Woops..right. Мой вопрос: как сделать этот вывод доступным для чтения. Либо сделайте «5,00 €» (\ u20ac), либо просто «5,00» – Demandar

+0

, тогда ответ будет следующим: ваш результат уже доступен для чтения, '\ u20ac' is ==' € '. Вы видите его представление в Юникоде, но если вы выполняете 'print item ['price'] [0]', вы увидите, что он есть. – eLRuLL

ответ

1

Простейший способ может быть, чтобы разделить один раз и заменить любую запятую с десятичной:

item["price"] = tank.xpath("text()").extract()[0].split(None,1)[0].replace(",",".") 

Это оставит вас с 5.00. Поскольку у вас есть * в строковой полосе, это не сработает, вы можете передать этот символ, чтобы удалить i, e [0].rstrip("\n* "), но если бы были другие ошибочные символы, которые могли бы сломаться.

Если вы хотите, знак евро тоже можно decode('unicode-escape'):

d={"price": ["5,00 \u20ac\n \n \n \n \n \n  *\n \n \n \n "]} 

d["price"] = d["price"][0].decode('unicode-escape').rstrip("\n * ").replace(",",".") 

print(d["price"]) 
5.00 € 

Если вы хотите, чтобы объединить его с расколом и сохранить знак, а также форматирование это немного лучше:

p,s,_ = d["price"][0].split(None, 2) 

d["price"] = u"{}{}".format(s.decode("unicode_escape"),p.replace(",",".")) 

print(d["price"]) 

Который даст вам:

€5.00 
+0

Большое вам спасибо. Отлично! Я все еще изучаю python и его первый раз, когда я видел split (None, 1). – Demandar

+1

@Demandar, просто означает разделение на любые пробелы один раз, мы просто хотим, чтобы первый элемент перед первым пробелом, а не точка, разделяющая целую строку. Если вы хотите использовать сплит-подход и сохранить знак, вы можете «разбить» (None, 2) ' –

+0

Получил! Спасибо. Не следует заменить ("\ n", "") работу? – Demandar

Смежные вопросы