2012-04-28 12 views
1

のデータを抽出し、私は、このXMLファイルがあります。それぞれの映画のためにそのspecifficデータを抽出し、ファイルを反復処理するにはどうすればよい反復処理XMLファイルとそれから

<movie id = 0> 
    <Movie_name>The Shawshank Redemption </Movie_name> 
    <Address>http://www.imdb.com/title/tt0111161/ 
    </Address> 
    <year>1994 </year> 
    <stars>Tim Robbins Morgan Freeman Bob Gunton </stars> 
    <plot> plot... 
    </plot> 
    <keywords>Reviews, Showtimes</keywords> 
</movie> 

<movie id = 1> 
    <Movie_name>Inglourious Basterds </Movie_name> 
    <Address>http://www.imdb.com/title/tt0361748/ 
    </Address> 
    <year>2009 </year> 
    <stars>Brad Pitt M&#xE9;lanie Laurent Christoph Waltz </stars> 
    <plot>plot/... 
    </plot> 
    <keywords>Reviews, credits </keywords> 
</movie> 

を?私は映画0のための意味:その名前、住所、年など。

入力ファイルの構造は必須です。データの抽出はループ中に行うことができます。

大変ありがとうございます。

答えて

3

EDIT -

ボード上の改善XML入力を取って、私は強く@Lattywareによるコメントのように、あなたの入力を検証しようとしていることをお勧めします。私は、無効なXMLとHTMLで、BeautifulSoupが役に立つものを回復する良い仕事をしていることが分かります。ここでは、迅速に試してみると何をするかです:

from BeautifulSoup import BeautifulSoup 

# Note: I have added the <movielist> root element 
xml = """<movielist> 
<movie id = 0> 
    <Movie_name>The Shawshank Redemption </Movie_name> 
    <Address>http://www.imdb.com/title/tt0111161/ 
    </Address> 
    <year>1994 </year> 
    <stars>Tim Robbins Morgan Freeman Bob Gunton </stars> 
    <plot> plot... 
    </plot> 
    <keywords>Reviews, Showtimes</keywords> 
</movieNum> 

<movie id = 1> 
    <Movie_name>Inglourious Basterds </Movie_name> 
    <Address>http://www.imdb.com/title/tt0361748/ 
    </Address> 
    <year>2009 </year> 
    <stars>Brad Pitt M&#xE9;lanie Laurent Christoph Waltz </stars> 
    <plot>plot/... 
    </plot> 
    <keywords>Reviews, credits </keywords> 
</movieNum> 

</movielist>""" 

soup = BeautifulSoup(xml) 
movies = soup.findAll('movie') 

for movie in movies: 
    id_tag = movie['id'] 
    name = movie.find("movie_name").text 
    url = movie.find("address").text 
    year = movie.find("year").text 
    stars = movie.find("stars").text 
    plot = movie.find("plot").text 
    keywords = movie.find("keywords").text 
    for item in (id_tag, name, url, year, stars, plot, keywords): 
     print item 
    print '=' * 50 

この意志出力(IDタグがアクセスできるようになりました)以下の:それは、うまくいけばあなたのスタートを与える

0 
The Shawshank Redemption 
http://www.imdb.com/title/tt0111161/ 
1994 
Tim Robbins Morgan Freeman Bob Gunton 
plot... 
Reviews, Showtimes 
================================================== 
1 
Inglourious Basterds 
http://www.imdb.com/title/tt0361748/ 
2009 
Brad Pitt M&#xE9;lanie Laurent Christoph Waltz 
plot/... 
Reviews, credits 
================================================== 

...それができるだけでここから良くなる。

3

あなたはxml.etree.ElementTree.

をチェックアウトしたいと思う私はまた、あなたが持っていることは、有効なXMLが存在しないことに注意したいので、あなたが問題に遭遇するかもしれません。

<movie id="0"> 
    <name>The Shawshank Redemption</name> 
    <url>http://www.imdb.com/title/tt0111161/</url> 
    <year>1994</year> 
    <stars> 
    <star>Tim Robbins</star> 
    <star>Morgan Freeman</star> 
    <star>Bob Gunton</star> 
    </stars> 
    <plot>plot...</plot> 
    <keywords> 
    <keyword>Reviews</keyword> 
    <keyword>Showtimes</keyword> 
    </keywords> 
</movie> 

注小文字のタグ名と属性(<movieNum = 0>は意味がありません):有効なXMLは、おそらくより次のようになります。 XML宣言(例えば、<?xml version="1.0" encoding="UTF-8" ?>のように)が先頭にも必要です。たとえば、XML Validation、またはxmllintを使用してXMLを検証できます。

有効なXMLを取得したら、それを解析してiterparse()を使用して繰り返し処理するか、解析してから、作成した要素ツリーを反復処理します。

2

BeutifulSoupはより容認され、HTML(一部の囲みタグはオプション)で使用することもできます。 ElementTreeは、XMLが有効な場合にのみ使用できます。フラグメントを単一の要素にラップすることで、部分的に有効にすることができます。属性値は引用符で囲む必要があります。 Movieクラスが作成され、ムービー要素の情報をキャプチャする次の方法を試してください。クラスはdictから導出され、dictと同じように柔軟性があります。ただし、収集した情報から処理された値を返すために、独自のメソッドを作成することができます。

# -*- coding: utf-8 -*- 
import xml.etree.ElementTree as ET 

class Movie(dict): 

    def __init__(self, movie_element): 
     assert movie_element.tag == 'movie' # we are able to process only that 
     self['id'] = movie_element.attrib['id'] 
     for e in movie_element: 
      self[e.tag] = e.text.strip() 

    def name(self): 
     return self['Movie_name'] 

    def url(self): 
     return self['Address'] 

    def year(self): 
     return self['year']  

    def stars(self): 
     return self['stars'] 

    def plot(self): 
     return self['plot'] 

    def keywords(self): 
     return self['keywords'] 

    def __str__(self): 
     lst = [] 
     lst.append(self.name() + ' (' + self.year() + ')') 
     lst.append(self.stars()) 
     lst.append(self.url()) 
     return '\n'.join(lst) 


fragment = '''\ 
<movie id = "0"> 
    <Movie_name>The Shawshank Redemption </Movie_name> 
    <Address>http://www.imdb.com/title/tt0111161/ 
    </Address> 
    <year>1994 </year> 
    <stars>Tim Robbins Morgan Freeman Bob Gunton </stars> 
    <plot> plot... 
    </plot> 
    <keywords>Reviews, Showtimes</keywords> 
</movie> 

<movie id = "1"> 
    <Movie_name>Inglourious Basterds </Movie_name> 
    <Address>http://www.imdb.com/title/tt0361748/ 
    </Address> 
    <year>2009 </year> 
    <stars>Brad Pitt Melanie Laurent Christoph Waltz </stars> 
    <plot>plot/... 
    </plot> 
    <keywords>Reviews, credits </keywords> 
</movie> 
''' 

fixed_fragment = '<root>\n' + fragment + '</root>' 
##print fixed_fragment 

tree = ET.fromstring(fixed_fragment) 
movies = [] 
for m in tree: 
    movies.append(Movie(m)) 

for movie in movies: 
    print '\n------------------' 
    print movie  

それは私のコンソールに出力します:私は非ASCII文字を交換した

------------------ 
The Shawshank Redemption (1994) 
Tim Robbins Morgan Freeman Bob Gunton 
http://www.imdb.com/title/tt0111161/ 

------------------ 
Inglourious Basterds (2009) 
Brad Pitt Melanie Laurent Christoph Waltz 
http://www.imdb.com/title/tt0361748/ 

お知らせ - エンコーディングの問題を別途解決する必要があります。