2015-04-30 6 views
0

Я новичок в scrapy и немного на Python.scrapy selector xpath extract matching regex или slicing string

Я хочу получить элемент ['rating']. Рейтинг в форме строки «рейтинг 4», но я хочу только номер ... Как я могу получить его?

Я рассказал об этих решениях ниже, но не знаю, имеют ли они смысл. И никто не работает.

> item_pub['rating'] = review.xpath('/html/body//*/div[@class="details"]/table[@class="detailtoptable"]/tbody/tr[1]/td/img/@alt').re(r'\d+') #to extract only the number since the result with extract() would be "rating is 4" 

или

> item_pub['rating'] = review.xpath('/html/body//*/div[@class="details"]/table[@class="detailtoptable"]/tbody/tr[1]/td/img/@alt')[-1:].extract() #to extract only the number since the result with extract() would be "rating is 4" 

спасибо за помощь и извините за мой английский, я надеюсь, что моя проблема была ясна.

+0

Опубликовать образец файла html. –

+0

rating is 4

ответ

1

Ваш образ мышления в порядке, чтобы использовать регулярное выражение. У вас просто плохой Xpath.
Вот несколько советов:

  • нет необходимости делать /html/body//, вы не можете просто сделать //
  • нет необходимости, чтобы выбрать все элементы с //* только потом выбрать один элемент. Вы можете просто идти вперед и выбрать нужный элемент: //div
  • , если вы нашли этот XPath с помощью браузера, скорее всего, нет никакого действительно tbody элемент, так как браузеры добавить те часто

Попробуйте это следующим образом:

item_pub['rating'] = review.xpath('//div[@class="details"]/table[@class="detailtoptable"]/tr[1]/td/img/@alt').re_first(r'\d+') 
+0

Существует метод 're_first', когда вы ожидаете единственного значения. –

+0

Спасибо @ K.H., Я обновил свой ответ. – bosnjak

0

Через Beautiful Soup, вы могли бы сделать так,

>>> from bs4 import BeautifulSoup 
>>> s = '''<td> <img alt="rating is 4" title="rating is 4" src="/Shared\images\ratingstars_web8.gif"/> </td>''' 
>>> [re.search(r'\d+', i['alt']).group() for i in soup.select('td > img[alt*="rating"]')] 
['4']