Уведомления

Группа в Telegram: @pythonsu

#1 Май 22, 2012 16:58:17

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

Пытаюсь вытащить список наименований товара:
XPath скопирован из FireBug мозиллы

from urllib.request import urlopen
import lxml.html
url = 'http://www.pleer.ru/cifrovye-fotoapparaty~157.html'
page = urlopen(url).read()
doc = lxml.html.document_fromstring(page)
for article in doc.xpath('/html/body/div[2]/table/tbody/tr[2]/td[4]/table/tbody/tr/td[2]/div[2]/div/div/div/div/div/div[3]/table/tbody/tr/td/div[2]/p'):
    print(article)

ничего не выводит и не ругается.. подскажите, что не так делаю?

з.ы.: проверка в хроме по $x(“xpath”) результаты выводит верно

Отредактировано asphix (Май 22, 2012 16:59:37)

Офлайн

#2 Май 22, 2012 17:13:33

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

Не знаю, что в вашем XPath не так, возможно tbody не нужен или еще что-то. Но вообще, путями которые выдал Firebug пользоваться нехорошо. Лучше самому анализировать структуру страницы на предмет id'ов и классов и писать XPath относительно их.

Если я правильно понял и вам нужен номер товара (точнее все номера):

'//div[@class="description"]/p[1]'
описания:
'//div[@class="description"]/p[3]'
и т.д.

Upd
Кстати, если особых требований к загрузке страниц нет, то в простых случаях можно lxml.html.parse(url) использовать.

Отредактировано reclosedev (Май 22, 2012 17:31:04)

Офлайн

#3 Май 22, 2012 18:29:09

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

reclosedev, не всегда есть, к чему привязаться, и не всегда оно стоит результата. При смене разметки все равно все с большой вероятности полетит к черту.



Офлайн

#4 Май 22, 2012 18:42:52

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

asilyator
не всегда есть, к чему привязаться, и не всегда оно стоит результата.
Да, бывает: таблица в таблице в таблице… без единого класса, id'a или стиля и текст внутри <br>'ами поделен
asilyator
При смене разметки все равно все с большой вероятности полетит к черту.
Привязка к id'ам и к классам (в меньшей степени) немного снижает эту вероятность.

Офлайн

#5 Май 22, 2012 18:54:00

asilyator
От:
Зарегистрирован: 2010-10-24
Сообщения: 276
Репутация: +  -2  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

Абсолютно не факт, а вот потрахаться с ним придется больше (а там только скопипастить). За исключением, когда к обьекту явно идет обращение через js (например, json блок со своим уникальным ид).



Офлайн

#6 Май 22, 2012 21:31:14

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

в том и беда, что айдишников там нет

Офлайн

#7 Май 23, 2012 14:56:24

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

разобрался с XPath, но остался один вопросик:

есть выражение:

//tr[starts-with(@id, 'pr2cart_') and @class='product_row']/td/div[2][@class='description']/p[2]/span

Возвращает:
<span title="3 единицы товара" style="color:red;font-weight:bold;">...</span>

Можно ли каким-нибудь образом вытащить текст из тега title ? Т.е. в идеале хочется получить на выходе текст: “3 единицы товара”

Офлайн

#8 Май 23, 2012 16:18:25

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

отвечая на свой же вопрос:

string(//tr[starts-with(@id, 'pr2cart_') and @class='product_row']/td/div[2][@class='description']/p[2]/span/@title)

Офлайн

#9 Май 23, 2012 17:12:26

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml


Еще есть вариант воспользоваться методом элементов get(name, default=None) для получения любого атрибута:

el = doc.xpath('//div[@class="description"]/p[2]/span')
print el.get('title')
Но в данном случае ‘…/@title’ удобнее.

Офлайн

#10 Май 23, 2012 19:25:13

asphix
Зарегистрирован: 2012-05-17
Сообщения: 37
Репутация: +  0  -
Профиль   Отправить e-mail  

вопрос по xpath и lxml

интересный вариант, спасибо!

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version