Как извлечь текст с помощью lxml?
Вопрос
Я хочу извлечь текст на определенном веб-сайте. Вот веб-адрес, что я хочу извлечь текст, чтобы сделать скребок. 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 " ;, не сильно отличается, только немного меняется орфография и заглавные буквы различных навигационных операций.