一般に、このような問題を解決するには、最初に目的のページをテキストとしてダウンロードする必要があります(curlやwgetなどの外部ユーティリティを使用しますが、Javascriptが実行される前urllib.urlopen
にページがどのように表示されるかを確認したいので、ブラウザはダウンロードしないでください。実行するチャンス)そしてそれを研究してその構造を理解します。この場合、いくつかの調査の結果、関連する部分が次のようになっていることがわかります(関連性のない部分をいくつか挿入し、読みやすくするために線を分割します)...: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>
などなど。したがって、「subject」として、<a>
内のタグのコンテンツを<dt>
、「content」として、<dd>
それに続くタグのコンテンツ(同じ<dl>
)が必要です。
取得するヘッダーには次のものが含まれます。
Content-Type: text/html; charset=ks_c_5601-1987
したがって、そのエンコーディングをUnicodeに解釈する方法も見つける必要があります。エンコーディングはとしても知られている'euc_kr'
と思います。私のPythonインストールにはコーデックが付属しているようですが、自分のコーデックも確認する必要があります。
これらすべての側面を決定したらlxml.etree.parse
、URLを試してみてください。他の多くのWebページと同様に、URLは解析されません。実際には整形式のHTMLは表示されません(w3cのバリデーターを試してみてください)。それが壊れているいくつかの方法について調べてください)。
不正な形式のHTMLはWebで非常に一般的であるため、一般的なエラーを補正しようとする「耐性のあるパーサー」が存在します。Pythonで最も人気のあるのはBeautifulSoupであり、実際にlxmlが付属しています。lxml2.0.3以降では、BeautifulSoupを基になるパーサーとして使用し、ドキュメントが正しく解析されたかのように続行できます。 BeautifulSoupを直接使用する方が簡単です。
たとえば、そのURLで最初のいくつかのサブジェクト/コンテンツペアを出力するスクリプトを次に示します(これらは現在変更されており、元々は指定したものと同じでした;-)。Unicode出力をサポートするターミナルが必要です(たとえば、MacのTerminal.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のロジック、または「lxml衣類のBeautifulSoup」はそれほど違いはなく、さまざまなナビゲーション操作のスペルと大文字の区別が少し変わります。