2

初めての Python スクリプトを作成しようとしています。Web サイトから情報を取得するプログラムを作成したいと考えています。

Web サイトを開き、すべてのデータを読み取り、データをバイトから文字列に変換することができました。

import urllib.request

response = urllib.request.urlopen('http://www.imdb.com/title/tt0413573/episodes?season=10')
website = response.read()
response.close()

html = website.decode("utf-8")

print(type(html))
print(html)

文字列は大量です。それをリストに変換してリストを反復処理するか、単に文字列として保持するかはわかりません。

airdateすべてのキーワードを見つけて、文字列の次の行を取得した場合、私は何をしたいですか。

文字列をスクロールすると、これは関連するビットです。

<meta itemprop="episodeNumber" content="10"/>
<div class="airdate">
  Nov. 21, 2013
</div>

これは、文字列内で何度も発生します。私がやろうとしているのは、文字列をループしてこの結果を返すことです:

"episodeNumber" = some number
"airdate" = what ever date

残業の場合、これは文字列で発生します。私は試した:

keywords = ["airdate","episodeNumber"]
for i in keywords:
    if i in html:
        print (something)

私は正しい方法で自分自身を説明していることを願っています. 必要に応じて質問を編集します。

4

3 に答える 3

1

HTML/XML のような構造化テキストを扱う場合、この構造を活用する既存のツールを使用することをお勧めします。正規表現を使用したり手動で検索したりする代わりに、これにより、はるかに信頼性が高く読みやすいソリューションが得られます。この場合、lxmlをインストールして HTML を解析することをお勧めします。

この原則を問題に適用して、次のことを試してください (urllib.request をインポートしたため、Python 3 を使用していると仮定します)。

import lxml.html as html
import urllib.request

resp = urllib.request.urlopen('http://www.imdb.com/title/tt0413573/episodes?season=10')

fragment = html.fromstring(resp.read())

for info in fragment.find_class('info'):
    print('"episodeNumber" = ', info.find('meta').attrib['content'])
    print('"airdate" =', info.find_class('airdate')[0].text_content().strip())

エピソード番号と放送日が一致していることを確認するために、周囲の要素 (「info」クラスの div) を検索し、必要なデータを抽出します。

より手の込んだ要素を選択することでコードをより美しくすることができると確信していますが、これで始めることができます。


[HTML の構造に関する解決策に関する情報を追加しました。]

1 つのエピソードのデータを含む文字列は次のようになります。

<div class="info" itemprop="episodes" itemscope itemtype="...">
  <meta itemprop="episodeNumber" content="1"/>
  <div class="airdate">Sep. 26, 2013</div> <!-- already stripped whitespace -->
  <strong>
    <a href="/title/tt2911802/" title="Seal Our Fate" itemprop="name">...</a>
  </strong>
  <div class="item_description" itemprop="description">...</div>
  <div class="popoverContainer"></div>
  <div class="popoverContainer"></div>
</div>

最初に、1 つのエピソードのすべてのデータを含む div をそのクラス 'info' で選択します。最初に必要な情報は、div.info 要素の子である meta 要素であり、そのプロパティ 'content' に格納されています。

次に、情報を div.airdate 要素に格納する必要があります。今回は要素内にテキストとして格納されます。その周りの空白を取り除くために、strip() メソッドを使用しました。

于 2013-11-02T16:28:24.950 に答える
0

それはうまくいくでしょうか?

lines = website.splitlines()
lines.append('')
for index, line in enumerate(lines):
    for keyword in ["airdate","episodeNumber"]:
        if keyword in line:
            print(lines[index + 1])

キーワードが行に見つかった場合、次の行を出力します。

于 2013-11-02T15:23:10.553 に答える
0

これが初めての Python スクリプトである場合、これまでに作成したことは非常に印象的です。

正当なパーサーを使用して、解析を支援します。

BeautifulSoup4をチェック

# intellectual property belongs to imdb    
import urllib2
from bs4 import BeautifulSoup

# get the SOUP: tree structure out of the HTML page
soup = BeautifulSoup(urllib2.urlopen("http://www.imdb.com/title/tt0413573/episodes?season=10"))

result = {}
for div in soup.find_all("div", {"class":"airdate"}):
    # get the date and number and store in a dictionary
    date = div.text.encode('utf-8').strip()
    number = div.find_previous_sibling()['content']
    result[number] = date

print result

出力

{'10': 'Nov. 21, 2013', '1': 'Sep. 26, 2013', '3': 'Oct. 3, 2013', '2': 'Sep. 26, 2013', '5': 'Oct. 17, 2013', '4': 'Oct. 10, 2013', '7': 'Oct. 31, 2013', '6': 'Oct. 24, 2013', '9': 'Nov. 14, 2013', '8': 'Nov. 7, 2013'}

私があなたの質問を理解し、正しく答えたかどうか教えてください。

于 2013-11-02T17:31:18.587 に答える