Как извлечь текст с помощью lxml? - PullRequest
0 голосов
/ 25 октября 2009

Я хочу извлечь текст на определенном веб-сайте. Вот веб-адрес, что я хочу извлечь текст, чтобы сделать скребок. http://news.search.naver.com/search.naver?sm=tab_hty&where=news&query=times&x=0&y=0 на этой странице я хочу извлечь некоторый текст с полем темы и содержания отдельно. например, если вы откроете эту страницу, вы можете увидеть какой-то текст на странице,

ЯПОНСКИЙ ТОКИО Международный кинофестиваль EPA 연합 뉴스 세계 | 2009.10.25 (일) 오후 7:21 Япония, 25 октября 2009 года. Гает получила премию «Лучшая женская роль» за роль в фильме «Восемь раз», режиссером которого является французский режиссер Хаби Молия. EPA / DAI KUROKAWA

ЯПОНСКИЙ ТОКИО Международный кинофестиваль EPA 연합 뉴스 세계 | 2009.10.25 (일) 오후 7:18 она узнает, что получила награду за лучшую женскую роль за роль в фильме французского режиссера Хаби Моли «Восемь раз» во время церемонии награждения 22-го Токио ...

и т. Д. ,,,,

и, наконец, я хочу извлечь текст, такой как формат

ПРЕДМЕТ: МЕЖДУНАРОДНЫЙ ФЕСТИВАЛЬ ФИЛЬМОВ ЯПОНИИ ТОКИО СОДЕРЖАНИЕ: EPA 연합 뉴스 세계 | 2009.10.25 (일) 오후 7:21 Япония, 25 октября 2009 года. Гает получила премию «Лучшая женская роль» за роль в фильме «Восемь раз», режиссером которого является французский режиссер Хаби Молия. EPA / DAI KUROKAWA

ПРЕДМЕТ: ... СОДЕРЖАНИЕ: ...

И ТАК ВКЛ .. если кто-нибудь поможет, очень ценю. заранее спасибо.

1 Ответ

2 голосов
/ 25 октября 2009

В общем, для решения таких проблем вы должны сначала загрузить интересующую страницу в виде текста (используйте urllib.urlopen или что-нибудь еще, даже внешние утилиты, такие как curl или wget, но не браузер, поскольку вы хотите увидеть, как работает страница выглядит до , у любого Javascript был шанс запустить) и изучить его, чтобы понять его структуру. В этом случае, после некоторого изучения, вы обнаружите, что соответствующие части (отрывая некоторые нерелевантные части в head и разбивая строки на читабельность) ...:

<body onload=nx_init();>
 <dl>
 <dt>
<a href="http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=&oid=091&aid=0002497340"
 [[snipping other attributes of this tag]]>
JAPAN TOKYO INTERNATIONAL FILM FESTIVAL</a>
</dt>
 <dd class="txt_inline">
EPA¿¬ÇÕ´º½º ¼¼°è <span class="bar">
|</span>
 2009.10.25 (ÀÏ) ¿ÀÈÄ 7:21</dd>
 <dd class="sh_news_passage">
 Japan, 25 October 2009. Gayet won the Best Actress Award for her role in the film 'Eight <b>
Times</b>
 Up' directed by French filmmaker Xabi Molia. EPA/DAI KUROKAWA</dd>

и так далее. Таким образом, вы хотите в качестве «субъекта» содержимое тега <a> внутри <dt>, а в качестве «содержимого» - содержимое тегов <dd>, следующих за ним (в том же <dl>).

Заголовки, которые вы получаете:

Content-Type: text/html; charset=ks_c_5601-1987

поэтому вы также должны найти способ интерпретировать эту кодировку в Unicode - я полагаю, что кодировка также известна как 'euc_kr', и моя установка на Python поставляется с кодеком для нее, но вам следует проверить и вашу.

Как только вы определили все эти аспекты, вы пытаетесь lxml.etree.parse указать URL - и, как и многие другие веб-страницы, он не анализируется - он на самом деле не представляет правильно сформированный HTML ( попробуйте на нем валидаторы w3c, чтобы узнать, как он работает).

Поскольку плохо сформированный HTML так распространен в сети, существуют «толерантные парсеры», которые пытаются компенсировать распространенные ошибки. Самым популярным в Python является BeautifulSoup, и действительно, с ним поставляется lxml - с lxml 2.0.3 или более поздней версии вы можете использовать BeautifulSoup в качестве базового синтаксического анализатора, а затем действовать «так, как будто» документ проанализирован правильно - но я нахожу проще использовать BeautifulSoup напрямую.

Например, вот скрипт, который генерирует первые несколько пар субъект / контент по этому URL (в настоящее время они изменились, изначально они были такими же, как вы даете ;-). Вам нужен терминал, который поддерживает вывод Unicode (например, я запускаю это без проблем на терминале Mac.App, установленном в utf-8) - конечно, вместо print s вы можете иначе собрать фрагменты Unicode (например, добавьте их в список и ''.join, когда у вас есть все необходимые фрагменты), закодируйте их по своему желанию и т. д. и т. д.

from BeautifulSoup import BeautifulSoup
import urllib

def getit(pagetext, howmany=0):
  soup = BeautifulSoup(pagetext)
  results = []
  dls = soup.findAll('dl')
  for adl in dls:
    thedt = adl.dt
    while thedt:
      thea = thedt.a
      if thea:
        print 'SUBJECT:', thea.string
      thedd = thedt.findNextSibling('dd')
      if thedd:
        print 'CONTENT:',
        while thedd:
          for x in thedd.findAll(text=True):
            print x,
          thedd = thedd.findNextSibling('dd')
        print
      howmany -= 1
      if not howmany: return
      print
      thedt = thedt.findNextSibling('dt')

theurl = ('http://news.search.naver.com/search.naver?'
          'sm=tab%5Fhty&where=news&query=times&x=0&y=0')
thepage = urllib.urlopen(theurl).read()
getit(thepage, 3)

Логика в lxml, или «BeautifulSoup in lxml clothing», не сильно отличается, только немного меняется орфография и заглавные буквы различных навигационных операций.

...