Найти - Пользователи
Полная версия: вопрос по xpath и lxml
Начало » Python для новичков » вопрос по xpath и lxml
1
asphix
Пытаюсь вытащить список наименований товара:
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”) результаты выводит верно
reclosedev
Не знаю, что в вашем XPath не так, возможно tbody не нужен или еще что-то. Но вообще, путями которые выдал Firebug пользоваться нехорошо. Лучше самому анализировать структуру страницы на предмет id'ов и классов и писать XPath относительно их.

Если я правильно понял и вам нужен номер товара (точнее все номера):
'//div[@class="description"]/p[1]'
описания:
'//div[@class="description"]/p[3]'
и т.д.

Upd
Кстати, если особых требований к загрузке страниц нет, то в простых случаях можно lxml.html.parse(url) использовать.
asilyator
reclosedev, не всегда есть, к чему привязаться, и не всегда оно стоит результата. При смене разметки все равно все с большой вероятности полетит к черту.
reclosedev
asilyator
не всегда есть, к чему привязаться, и не всегда оно стоит результата.
Да, бывает: таблица в таблице в таблице… без единого класса, id'a или стиля и текст внутри <br>'ами поделен
asilyator
При смене разметки все равно все с большой вероятности полетит к черту.
Привязка к id'ам и к классам (в меньшей степени) немного снижает эту вероятность.
asilyator
Абсолютно не факт, а вот потрахаться с ним придется больше (а там только скопипастить). За исключением, когда к обьекту явно идет обращение через js (например, json блок со своим уникальным ид).
asphix
в том и беда, что айдишников там нет
asphix
разобрался с 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 единицы товара”
asphix
отвечая на свой же вопрос:

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

Еще есть вариант воспользоваться методом элементов get(name, default=None) для получения любого атрибута:
el = doc.xpath('//div[@class="description"]/p[2]/span')
print el.get('title')
Но в данном случае ‘…/@title’ удобнее.
asphix
интересный вариант, спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB