Поиск по блогу

среда, 21 января 2015 г.

Первый вариант шаблона для подбора и проверки XPath запросов и команды для нормализации строк

На примере carmailPrice. Здесь мы пробуем XPath запросы и тут же чистим полученные списки от лишних проблеов и переносов строк. Возвращаемся к задаче парсинга страницы bmw_mail. Сначала "фотографируем" страницу, потом копипастим сюда фрагмент кода, потом подбираем XPath запросы, потом формируем цепочки для чистки текстовых строк ' '.join(), replace(), split(), strip() эту чистку гордо именуем нормализацией. Работа муторная, но пост наглядный... Потому что с lxml html.fromstring(In[2]) ... а вссылках - примеры кода для "remove ALL whitespace from String"

In [1]:
from IPython.display import Image, HTML
Image ('C:\\Users\\kiss\\Pictures\\pythonR\\bmw_mail.png')
Out[1]:

Вот HTML код этого фрагмента для парсинга

In [4]:
from lxml import html
in2=html.fromstring(In[2])
In [2]:
<div class="catalog-age__mod__item__box">

 <div class="catalog-age__mod__item__type clear">
  <div class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_title">
   <a href="https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/specifications/?gear_type=204&amp;fuel=59&amp;modification_id=22939" class="catalog-age__mod__item__type__link">320d 184hp xDrive AT</a>
  </div>
  <div class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_hp">184 л.с.</div>
 </div>

 <div class="catalog-age__mod__item__note">
  Автомат,
  полный&nbsp;привод,
  дизель, 7.4&nbsp;с&nbsp;до&nbsp;100&nbsp;км/ч
 </div>

  <a href="https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30440/" class="catalog-age__mod__item__equip clear">
  <span>Sport Line SKD</span>
  <div class="catalog-age__mod__item__equip__price">
   <span class="catalog-age__mod__item__equip__price__value">
    <span class="rank"><i>1</i><i>752</i><i>000</i></span>
   </span>
   <span class="catalog-age__mod__item__equip__price__note">руб.</span>
  </div>
  </a>
 
 <a href="https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/35796/" class="catalog-age__mod__item__equip clear">
  <span>Modern Line SKD</span>

  <div class="catalog-age__mod__item__equip__price">
   <span class="catalog-age__mod__item__equip__price__value">
    <span class="rank"><i>1</i><i>883</i><i>000</i></span>
   </span>
   <span class="catalog-age__mod__item__equip__price__note">руб.</span>
  </div>
 </a>
 
 <a href="https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30439/" class="catalog-age__mod__item__equip clear">
   <span>Luxury Line SKD</span>

  <div class="catalog-age__mod__item__equip__price">
   <span class="catalog-age__mod__item__equip__price__value">
    <span class="rank"><i>1</i><i>950</i><i>000</i></span>
   </span>
   <span class="catalog-age__mod__item__equip__price__note">руб.</span>
  </div>
 </a>
 
 </div>
  File "<ipython-input-2-4bd3a1cdd944>", line 1
    <div class="catalog-age__mod__item__box">
    ^
SyntaxError: invalid syntax
In [5]:
in2.xpath('//div[@class="catalog-age__mod__item__box"]/a/@href')
Out[5]:
['https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30440/',
 'https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/35796/',
 'https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30439/']
In [6]:
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/@href')
Out[6]:
['https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30440/',
 'https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/35796/',
 'https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30439/']
In []:
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/parent::div[@class="catalog-age__mod__item__note"]/text()').
In [7]:
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/span[1]/text()')
Out[7]:
['Sport Line SKD', 'Modern Line SKD', 'Luxury Line SKD']
In [11]:
''.join(in2.xpath('//a[@class="catalog-age__mod__item__equip clear"][1]/div/span/span[@class="rank"]/i/text()'))
Out[11]:
'1752000'
In [15]:
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/preceding-sibling::div[@class="catalog-age__mod__item__note"]/text()').
Out[15]:
[u'\n\t \u0410\u0432\u0442\u043e\u043c\u0430\u0442,\n\t \u043f\u043e\u043b\u043d\u044b\u0439\xa0\u043f\u0440\u0438\u0432\u043e\u0434,\n\t \u0434\u0438\u0437\u0435\u043b\u044c, 7.4\xa0\u0441\xa0\u0434\u043e\xa0100\xa0\u043a\u043c/\u0447\n\t']
In [2]:
<div class="catalog-age__mod__item__box">

 <div class="catalog-age__mod__item__type clear">
  <div class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_title">
   <a href="https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/specifications/?gear_type=204&amp;fuel=59&amp;modification_id=22939" class="catalog-age__mod__item__type__link">320d 184hp xDrive AT</a>
  </div>
  <div class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_hp">184 л.с.</div>
 </div>

 <div class="catalog-age__mod__item__note">
  Автомат,
  полный&nbsp;привод,
  дизель, 7.4&nbsp;с&nbsp;до&nbsp;100&nbsp;км/ч
 </div>

  <a href="https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30440/" class="catalog-age__mod__item__equip clear">
  <span>Sport Line SKD</span>
  <div class="catalog-age__mod__item__equip__price">
   <span class="catalog-age__mod__item__equip__price__value">
    <span class="rank"><i>1</i><i>752</i><i>000</i></span>
   </span>
   <span class="catalog-age__mod__item__equip__price__note">руб.</span>
  </div>
  </a>
 
 <a href="https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/35796/" class="catalog-age__mod__item__equip clear">
  <span>Modern Line SKD</span>

  <div class="catalog-age__mod__item__equip__price">
   <span class="catalog-age__mod__item__equip__price__value">
    <span class="rank"><i>1</i><i>883</i><i>000</i></span>
   </span>
   <span class="catalog-age__mod__item__equip__price__note">руб.</span>
  </div>
 </a>
 
 <a href="https://cars.mail.ru/catalog/bmw/3/f30_31/sedan/30439/" class="catalog-age__mod__item__equip clear">
   <span>Luxury Line SKD</span>

  <div class="catalog-age__mod__item__equip__price">
   <span class="catalog-age__mod__item__equip__price__value">
    <span class="rank"><i>1</i><i>950</i><i>000</i></span>
   </span>
   <span class="catalog-age__mod__item__equip__price__note">руб.</span>
  </div>
 </a>
 
 </div>
  File "<ipython-input-2-4bd3a1cdd944>", line 1
    <div class="catalog-age__mod__item__box">
    ^
SyntaxError: invalid syntax

Update Может быть кавычки попробовать, чтобы не было ошибки? Здесь не хочу портить почти готовый пост. А в последующих надо бы не забыть проверить...

In [4]:
from lxml import html
in2=html.fromstring(In[2])
In [8]:
sib=in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/preceding-sibling::div[@class="catalog-age__mod__item__note"]/text()')
In [10]:
''.join(sib).encode('utf8')
Out[10]:
'\n\t \xd0\x90\xd0\xb2\xd1\x82\xd0\xbe\xd0\xbc\xd0\xb0\xd1\x82,\n\t \xd0\xbf\xd0\xbe\xd0\xbb\xd0\xbd\xd1\x8b\xd0\xb9\xc2\xa0\xd0\xbf\xd1\x80\xd0\xb8\xd0\xb2\xd0\xbe\xd0\xb4,\n\t \xd0\xb4\xd0\xb8\xd0\xb7\xd0\xb5\xd0\xbb\xd1\x8c, 7.4\xc2\xa0\xd1\x81\xc2\xa0\xd0\xb4\xd0\xbe\xc2\xa0100\xc2\xa0\xd0\xba\xd0\xbc/\xd1\x87\n\t'
In [11]:
print ''.join(sib).encode('utf8')
  Автомат,
  полный привод,
  дизель, 7.4 с до 100 км/ч
 

In [12]:
print ''.join(sib).replace('\n','').strip().encode('utf8')
Автомат,  полный привод,  дизель, 7.4 с до 100 км/ч

In [20]:
str1= ''.join(sib).replace('\n','').strip()
print ' '.join(str1.split()).encode('utf8')
Автомат, полный привод, дизель, 7.4 с до 100 км/ч

In [21]:
str1= ''.join(sib).replace('\n','')
print ' '.join(str1.split()).encode('utf8')
Автомат, полный привод, дизель, 7.4 с до 100 км/ч

In [22]:
str1= ''.join(sib).replace('\n','').encode('utf8')
print ' '.join(str1.split())
Автомат, полный привод, дизель, 7.4 с до 100 км/ч

Читаем заголовок раздела (с лошадиными силами ...двигателя)

In [25]:
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/preceding-sibling::div[@class="catalog-age__mod__item__type clear"] \
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_title"]/a/text()')
Out[25]:
['320d 184hp xDrive AT']
In [29]:
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/preceding-sibling::div[@class="catalog-age__mod__item__type clear"] \
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_hp"]/text()')
Out[29]:
[u'184 \u043b.\u0441.']
In [28]:
sibp=in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/preceding-sibling::div[@class="catalog-age__mod__item__type clear"]\
/div[@class="catalog-age__mod__item__type__text catalog-age__mod__item__type__text_hp"]/text()')
print ''.join(sibp).strip().encode('utf8')
184 л.с.

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



Посты чуть ниже также могут вас заинтересовать

Комментариев нет:

Отправить комментарий