質問

i特定のWebサイトでテキストを抽出したい。 ここに私がスクレーパーを作るためにいくつかのテキストを抽出したいウェブアドレスです。 http://news.search.naver.com/search.naver?sm=tab_hty <!> amp; where = news <!> amp; query = times <!> amp; x = 0 < !> amp; y = 0 このページでは、件名とコンテンツフィールドが別々にあるテキストを抽出します。 たとえば、そのページを開くと、ページ内にテキストが表示されます

日本東京国際映画祭     EPA <!>#50672; <!>#54633; <!>#45684; <!>#49828; <!>#49464; <!>#44228; | 2009.10.25(<!>#51068;)<!>#50724; <!>#54980; 7:21     日本、2009年10月25日。ゲイエは、フランスの映画製作者シャビ・モリア監督の映画「エイトタイムズアップ」で彼女の役を演じて最優秀女優賞を受賞しました。 EPA / DAI KUROKAWA

日本東京国際映画祭     EPA <!>#50672; <!>#54633; <!>#45684; <!>#49828; <!>#49464; <!>#44228; | 2009.10.25(<!>#51068;)<!>#50724; <!>#54980; 7:18     彼女は、第22回東京の授賞式で、フランスの映画監督シャビモリアによる映画「エイトタイムズアップ」で彼女が主演女優賞を受賞したことを知ります...

など、、、、、

そして最後にフォーマットのようなテキストを抽出したい

SUBJECT:JAPAN TOKYO INTERNATIONAL FILM FESTIVAL 内容:EPA <!>#50672; <!>#54633; <!>#45684; <!>#49828; <!>#49464; <!>#44228; | 2009.10.25(<!>#51068;)<!>#50724; <!>#54980; 7:21日本、2009年10月25日。ゲイエは、フランスの映画製作者シャビ・モリア監督の映画「エイトタイムズアップ」で彼女の役を演じ、最優秀女優賞を受賞しました。 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>タグのコンテンツ、および<!> quot; content <!> quot;それに続く<dd>タグのコンテンツ(同じ<dl>内)。

取得するヘッダーには次が含まれます:

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

そのため、そのエンコードをUnicodeに解釈する方法も見つける必要があります-エンコードは'euc_kr'とも呼ばれ、Pythonのインストールにはコーデックが付属しているように見えますが、それも確認する必要があります。

これらのすべての側面を決定したら、URLをlxml.etree.parseしようとします-そして、他の多くのWebページと同様に、解析もしません-整形式のHTML( w3cのバリデータを試して、壊れている方法のいくつかを調べてください。

不正な形式のHTMLはWeb上で非常に一般的であるため、<!> quot;トレラントパーサー<!> quot;が存在します。一般的なエラーを補おうとします。 Pythonで最も人気のあるのはBeautifulSoupであり、実際にはlxmlが付属しています。lxml2.0.3以降では、BeautifulSoupを基になるパーサーとして使用し、<!> quot;ちょうど<!> quot;を続行できます。ドキュメントは正しく解析されましたが、BeautifulSoupを直接使用する方が簡単です。

たとえば、次のスクリプトは、そのURLで最初の数件のサブジェクト/コンテンツのペアを発行します(現在変更されていますが、元は指定したものと同じでした;-)。 Unicode出力をサポートする端末が必要です(たとえば、utf-8に設定されたMacのTerminal.Appでこれを問題なく実行します)-もちろん、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のロジック、または<!> quot; lxml clothing <!> quot;のBeautifulSoupはそれほど違いはありません。さまざまなナビゲーション操作のスペルと大文字小文字が少し変わります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top