Уведомления

Группа в Telegram: @pythonsu

#1 Фев. 17, 2013 14:01:23

shau-kote
Зарегистрирован: 2013-02-17
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Википедии с помощью LXML

Всем доброго времени суток.

Понадобилось мне вытащить из Википедии, а конкретно из этой её страницы ссылки на все статьи, которые там собраны (как содержимое категории).

Погуглив, я решил использовать для этого LXML, а в качестве опоры взял данную статью на Хабре. Вытащив XPath FireBug'ом, я написал следующий код:

import urllib
import lxml.html
page = urllib.urlopen(<ссылка на страницу>)
doc = lxml.html.document_fromstring(page.read())
for topic in doc.xpath('/html/body/div[3]/div[3]/div[4]/div[2]/div/div/table/tbody/tr/td/ul/li'):
	a = topic.xpath('/a')
	print a.get('href')

Увы, эффект от его выполнения был вполне так нулевой.
Буду признателен, если более опытные форумчане подскажут мне мои ошибки.

З.Ы. Учитывая, что проблема косвенно связана с выполнением практикума в университете, возможно, модераторы сочтут более подходящим перенести тему в “Центр помощи”.

Отредактировано shau-kote (Фев. 17, 2013 14:03:49)

Офлайн

#2 Фев. 17, 2013 15:01:57

s0rg
От:
Зарегистрирован: 2011-06-05
Сообщения: 777
Репутация: +  25  -
Профиль   Отправить e-mail  

Парсинг Википедии с помощью LXML

попробуйте убрать tbody из xpath'а

Офлайн

#3 Фев. 17, 2013 15:03:25

shau-kote
Зарегистрирован: 2013-02-17
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Википедии с помощью LXML

Неа. Результат тот же.

Офлайн

#4 Фев. 17, 2013 15:21:38

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Парсинг Википедии с помощью LXML

Браузеры генерят плохой XPath.
Я сам не много с XPath работал, так что за качество не ручаюсь, но такой вариант работает:

import requests
import lxml.html
resp = requests.get('http://ru.wikipedia.org/wiki/Категория:Животные_по_алфавиту')
doc = lxml.html.document_fromstring(resp.text)
links = doc.xpath('//*[@id="mw-pages"]//li[a]/a')
for link in links:
  print(link.get('href'))

P.S. если планируешь заниматься парсингом, присмотрись к grab



Отредактировано GaiveR (Фев. 17, 2013 15:23:59)

Офлайн

#5 Фев. 17, 2013 16:40:55

sanodin
От:
Зарегистрирован: 2011-06-16
Сообщения: 515
Репутация: +  31  -
Профиль   Отправить e-mail  

Парсинг Википедии с помощью LXML

Есть оффлайн база википедии и есть там база кажется и в xml формате…так для сведения…
она весит многовато…

Офлайн

#6 Фев. 17, 2013 18:03:12

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Парсинг Википедии с помощью LXML

Как правильно парсить с помощью xpath:
* прочитать мануал по xpath, выучить xpath
* profit!

Как парсить неправильно с помощью xpath:
* не читать мануалов по xpath
* использовать магические xpath, сгенерированные кем-то, например, браузером
* задавать вопросы на форумах типа, я не знаю xpath, почему у меня ничего не работает

Офлайн

#7 Фев. 18, 2013 05:46:22

shau-kote
Зарегистрирован: 2013-02-17
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Википедии с помощью LXML

GaiveR, спасибо.
Не могли бы прокомментировать фразу “Браузеры генерят плохой XPath. ”?
Насколько я понимаю, XPath - это фактически путь в дереве XML-документа, т.е. он определяется структурой документа и только, разве нет?

Отредактировано shau-kote (Фев. 18, 2013 05:46:37)

Офлайн

#8 Фев. 18, 2013 19:14:34

GaiveR
От:
Зарегистрирован: 2011-08-13
Сообщения: 122
Репутация: +  16  -
Профиль   Отправить e-mail  

Парсинг Википедии с помощью LXML

shau-kote
Насколько я понимаю, XPath - это фактически путь в дереве XML-документа, т.е. он определяется структурой документа и только, разве нет?
XPath -> XML Path Language -> язык запросов к элементам XML-документа. Т.е. это не просто путь, это язык запросов.

Вообще lorien правильно говорит, надо почитать доки по xpath и не знать бед. Но у меня самого руки не доходят :)



Офлайн

#9 Фев. 18, 2013 22:25:21

shau-kote
Зарегистрирован: 2013-02-17
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг Википедии с помощью LXML

Ну я прочитал статью в Википедии и несколько статей по самому lxml. Полагаю, этого достаточно для краткого ликбеза.

Офлайн

#10 Фев. 19, 2013 18:21:56

lorien
От:
Зарегистрирован: 2006-08-20
Сообщения: 755
Репутация: +  37  -
Профиль  

Парсинг Википедии с помощью LXML

> Ну я прочитал статью в Википедии и несколько статей по самому lxml. Полагаю, этого достаточно для краткого ликбеза.

Вам нужно понять, что такое решение проблемы. Есть сложная проблема, разбиваете её на мелкие под-проблеммы. Например, у вас длинный xpath, он не работает, отсеките большую часть, убедитесь что xpath находит вершину пути, далее добавляйте xpath по кусочкам, пока он не перестанет работать. Проанализируйте это место и вы найдёте решение.

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

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version