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