Помогите (или совет) мне начать работу с lxml - PullRequest
3 голосов
/ 22 апреля 2011

Я пытаюсь выучить Python, и на самом деле я чувствую, что «выучить Python - трудный путь», «байт Python» и «Head First Python» - действительно хорошие книги. Однако - теперь, когда я хочу начать «настоящий» проект, lxml заставляет меня чувствовать себя полным мерзавцем.

Это то, что я хотел бы сделать (цели)

Я пытаюсь разобрать в газетных сайтах статью о политике

URL-адрес http://politiken.dk/politik/

Окончательный проект должен

  • 1) посещение каждый день (может каждый час) вышеуказанный URL
  • 2) для каждого соответствующего статья, я хочу сохранить ссылку на база данных. Соответствующие статьи в <div class="w460 section_forside sec-forside">. Некоторые элементы имеют изображения, некоторые не делает.

Я хотел бы сохранить следующее:

  • a - заголовок (<h1 class="top-art-header fs-26">)
  • b - подзаголовок (<p class="subheader-art">)
  • c - если элемент имеет соответствующий img, то атрибут «alt» или «title»

  • 3) посетите каждый соответствующий URL, очистите тело статьи и сохраните его в базе данных.

  • 4) если каждый соответствующий URL уже находится в базе данных, я пропускаю этот URL (соответствующие статьи, как определено выше, всегда являются последними 10 опубликованными)

Желаемым результатом должна быть таблица базы данных с полями:

  • art.i) ID
  • art.ii) URL
  • art.iii) заголовок
  • art.iiii) подзаголовок
  • art.iiiii) img alt
  • art.iiiiii) статья тела.
  • art.iiiiiii) дата и время (строка расположена в <span class="date tr-upper m-top-2">)

Выше я хотел бы помочь с помощью вышесказанного. Поскольку очистка экрана не всегда благоприятна, я хотел бы объяснить , почему я хочу это сделать .

В основном я хочу получить данные для случаев члены парламента или политических партий. Я не буду публиковать статьи, продавать данные или что-то подобное (я не проверял законность своего подхода, но надеюсь и считаю, что он должен быть законным)

Я думаю, у меня есть стол политиков и стол политических партий.

для каждого политика у меня будет:

  • pol.i) ID
  • pol.ii) first_name
  • pol.iii) имя_урю
  • pol.iiii) партия

Для каждой политической партии у меня будет:

  • party.i) ID
  • party.ii) правильное имя
  • party.iii) вызывающее имя -party.iiii) сокращение

Я хочу сделать это для нескольких датских газетных сайтов, а затем проанализировать, если одна газета дает предпочтения некоторым политикам / партиям - просто на основе количества упоминаний.

Мне также понадобится помощь, но по одному шагу за раз: -)

Позже я хотел бы изучить NLTK и возможности майнинга настроений.

Я хочу посмотреть, может ли это превратиться в доктора философии. проект в области политологии / журналистики.

Это в основном то, что у меня есть (т.е. ничего)

Мне действительно тяжело оборачиваться вокруг lxml, концепции элементов, различных синтаксических анализов и т. Д. Я, конечно, читал учебные пособия, но я все еще очень застрял.

import lxml.html

url = "http://politiken.dk/politik/"
root = lxml.html.parse(url).getroot()
# this should retur return all the relevant elements
# does not work:
#relevant = root.cssselect("divi.w460 section_forside sec-forside") # the class has spaces in the name - but I can't seem to escape them?

# this will return all the linked artikles headlines
artikler = root.cssselect("h1.top-art-header")

# narrowing down, we use the same call to get just the URLs of the articles that we have already retrieved
# theese urls we will later mine, and subsequently skip
retrived_urls=[]
for a in root.cssselect("h1.top-art-header a"):
    retrived_urls.append(a)
# this works. 

Что я надеюсь получить от ответов

Во-первых, если вы не называете меня (очень плохими) именами, я буду и впредь счастлив.

  • Но я очень надеюсь, что это простое объяснение того, как работает lxml. Если бы я знал, какие инструменты использовать для вышеперечисленных задач, мне было бы намного проще «погрузиться в lxml». Может быть, из-за моего небольшого объема внимания я в настоящее время разочаровываюсь, когда читаю вещи, которые намного выше моего уровня понимания, когда я даже не уверен, что смотрю в нужном месте.
  • Если бы вы могли предоставить пример кода, который подходит для некоторых задач, это было бы действительно здорово. Я надеюсь превратить этот проект в докторскую диссертацию. но я уверен, что такого рода вещи должны были быть сделаны уже тысячу раз? Если да, то, по моему опыту, учиться у других - отличный способ стать умнее.
  • Если вы сильно чувствуете, что я должен забыть об lxml и использовать, например. scrapy или html5lib, тогда, пожалуйста, скажите так :-) Я начал изучать html5lib, потому что Дрю Конуэй в своем блоге предлагает об инструментах python для политолога, но я не смог найти никакого материала начального уровня. Alsp lxml - это то, что рекомендуют хорошие люди из scraperwiki. Что касается скрапинга, это может быть лучшим решением, но я боюсь, что скрапирование во многом является основой - как таковой действительно хорошо, если вы знаете, что делаете, и хотите сделать это быстро, но, возможно, не лучший способ изучите магию питона.
  • Я планирую использовать реляционную базу данных, но если вы думаете, например, Монго будет преимуществом, я поменяю свои планы.
  • Поскольку я не могу установить import lxml в python 3.1, я использую 2.6. Если это не так - скажите, пожалуйста, тоже.

Сроки

Я задал кучу вопросов для начинающих по stackoverflow. Слишком много, чтобы гордиться. Но с более чем полной работой я, кажется, никогда не смогу погрузиться в код и просто впитать навыки, которых я так жажду. Я надеюсь, что это будет вопрос / ответ, к которому я могу вернуться, чтобы регулярно обновлять то, что я узнал, и заново изучать то, что я забыл. Это также означает, что этот вопрос, скорее всего, будет оставаться активным в течение достаточно долгого времени. Но я буду комментировать каждый ответ, который мне посчастливится получить, и я буду постоянно обновлять раздел «что я получил».

В настоящее время я чувствую, что, возможно, откусил больше, чем смогу пережевывать - так что теперь он вернулся к «головой первого питона» и «изучению питона трудным путем».

Заключительные слова

Если вы зашли так далеко - вы удивительны - даже если вы не отвечаете на вопрос. Теперь вы прочитали много простых, запутанных и глупых вопросов (я горжусь тем, что задаю свои вопросы, поэтому не спорьте). Вы должны взять кофе и дым без фильтра и поздравить себя: -)

Счастливых праздников (в Дании мы празднуем Пасху, и в настоящее время солнце светит как бумажник Самуала Джексона в художественной литературе)

Изменение в

Кажется, прекрасный суп - хороший выбор. Однако, по словам разработчика, BeautifulSoup не очень хороший выбор, если я хочу использовать python3. Но согласно this я бы предпочел python3 (хотя и не сильно).

Я также обнаружил, что в главе "Погружение в python 3" есть глава lxml. Посмотрим на это тоже.

Ответы [ 2 ]

3 голосов
/ 25 апреля 2011

Это много, чтобы прочитать - возможно, вы могли бы разбить на более мелкие конкретные вопросы.

Относительно lxml, здесь - некоторые примеры.Официальная документация также очень хороша - найдите время, чтобы разобраться с примерами.И список рассылки очень активен.

Что касается BeautifulSoup, то lxml более эффективен и, по моему опыту, может лучше обрабатывать битый HTML, чем BeautifulSoup.Недостатком является то, что lxml опирается на библиотеки C, поэтому его сложнее установить.

2 голосов
/ 05 мая 2011

lxml определенно является предпочтительным инструментом для анализа html.

Здесь есть шпаргалка lxml со многими вашими ответами:

http://scraperwiki.com/docs/contrib/python_lxml_cheat_sheet/

Этот пакет кода, который вы написали, работает как есть и работает в окне редактирования ScraperWiki. http://scraperwiki.com/scrapers/andreas_stackoverflow_example/edit/

Обычно ссылка имеет вид: название

После разбора по lxml вы можете перейти по ссылке, используя: a.attrib.get ( "HREF") и текст с помощью a.text

Однако в данном конкретном случае ссылки имеют вид: title поэтому значение a.text представляет только символы между '' и первым ''.

Но вы можете использовать следующий код, чтобы сгладить его, повторяя через подэлементы (в данном случае ):

def flatten(el):           
    result = [ (el.text or "") ]
    for sel in el:
        result.append(flatten(sel))
        result.append(sel.tail or "")
    return "".join(result)
...