На примере carmailPrice. Здесь мы пробуем XPath запросы и тут же чистим полученные списки от лишних проблеов и переносов строк. Возвращаемся к задаче парсинга страницы bmw_mail. Сначала "фотографируем" страницу, потом копипастим сюда фрагмент кода, потом подбираем XPath запросы, потом формируем цепочки для чистки текстовых строк ' '.join(), replace(), split(), strip() эту чистку гордо именуем нормализацией. Работа муторная, но пост наглядный... Потому что с lxml html.fromstring(In[2]) ... а вссылках - примеры кода для "remove ALL whitespace from String"
from IPython.display import Image, HTML
Image ('C:\\Users\\kiss\\Pictures\\pythonR\\bmw_mail.png')
Вот HTML код этого фрагмента для парсинга¶
from lxml import html
in2=html.fromstring(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&fuel=59&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">
Автомат,
полный привод,
дизель, 7.4 с до 100 км/ч
</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>
in2.xpath('//div[@class="catalog-age__mod__item__box"]/a/@href')
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/@href')
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/parent::div[@class="catalog-age__mod__item__note"]/text()').
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/span[1]/text()')
''.join(in2.xpath('//a[@class="catalog-age__mod__item__equip clear"][1]/div/span/span[@class="rank"]/i/text()'))
in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/preceding-sibling::div[@class="catalog-age__mod__item__note"]/text()').
<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&fuel=59&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">
Автомат,
полный привод,
дизель, 7.4 с до 100 км/ч
</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>
Update Может быть кавычки попробовать, чтобы не было ошибки? Здесь не хочу портить почти готовый пост. А в последующих надо бы не забыть проверить...
from lxml import html
in2=html.fromstring(In[2])
sib=in2.xpath('//a[@class="catalog-age__mod__item__equip clear"]/preceding-sibling::div[@class="catalog-age__mod__item__note"]/text()')
''.join(sib).encode('utf8')
print ''.join(sib).encode('utf8')
print ''.join(sib).replace('\n','').strip().encode('utf8')
str1= ''.join(sib).replace('\n','').strip()
print ' '.join(str1.split()).encode('utf8')
str1= ''.join(sib).replace('\n','')
print ' '.join(str1.split()).encode('utf8')
str1= ''.join(sib).replace('\n','').encode('utf8')
print ' '.join(str1.split())
Читаем заголовок раздела (с лошадиными силами ...двигателя)¶
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()')
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()')
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')
Ну вот, полагаю здесь достаточное количество примеров. В последующих постах опубликуем варианты готового спайдера.
Посты чуть ниже также могут вас заинтересовать
Комментариев нет:
Отправить комментарий