Вопрос

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

ЯПОНСКИЙ ТОКИО Международный кинофестиваль     EPA # 50672 &; # 54633 &; # 45684 & & # 49828; # 49464 & & # 44228; | 2009.10.25 (& # 51068;) & # 50724; & # 54980; 7:21     Япония, 25 октября 2009 года. Гает получила премию «Лучшая женская роль» за роль в фильме «Восемь раз», режиссером которого является французский режиссер Хаби Молия. EPA / DAI KUROKAWA

ЯПОНСКИЙ ТОКИО Международный кинофестиваль     EPA # 50672 &; # 54633 &; # 45684 & & # 49828; # 49464 & & # 44228; | 2009.10.25 (& # 51068;) & # 50724; & # 54980; 7:18     она узнает, что получила награду за лучшую женскую роль за роль в фильме французского режиссера Хаби Молии «Восемь раз» во время церемонии награждения 22-го Токио ...

и так далее ,,,,

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

ПРЕДМЕТ: ЯПОНСКИЙ ТОКИО Международный кинофестиваль СОДЕРЖАНИЕ: & & & & EPA # 50672 # 54633 # 45684 # 49828; # 49464 & & # 44228; | 2009.10.25 (& # 51068;) & # 50724; & # 54980; 7:21 Япония, 25 октября 2009 года. Гайет получила награду за лучшую женскую роль за роль в фильме «Восемь раз», режиссером которого является французский режиссер Хаби Молия. EPA / DAI KUROKAWA

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

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

Это было полезно?

Решение

В общем, для решения таких проблем вы должны сначала загрузить интересующую страницу в виде текста (используйте 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>

и так далее. Итак, вы хотите как & Quot; subject & Quot; содержимое тега <a> внутри <dt> и " content " содержимое тегов <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 в качестве базового парсера, а затем продолжить & Quot; как будто & Quot; документ был проанализирован правильно, но я считаю, что проще использовать BeautifulSoup напрямую.

Например, вот скрипт, который генерирует несколько первых пар «субъект / контент» по этому URL-адресу (в настоящее время они изменились, изначально они были такими же, как и вы ;-). Вам нужен терминал, который поддерживает вывод Unicode (например, я запускаю это без проблем на терминале Mac.App, настроенном на utf-8) - конечно, вместо print вы можете иначе собрать фрагменты 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 в lxml clothing " ;, не сильно отличается, только немного меняется орфография и заглавные буквы различных навигационных операций.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top