2011-01-07 6 views
5

私はここで初めてPythonのスキルを習得しようとしています。私に親切にしてください:-)Pythonでhtml-table-datasetをループする方法

私はプログラミングの概念を完全に知らないわけではありませんが(私はこれまでPHPを使いこなしてきました)、Pythonへの移行はやや困難でした。これは主に、一般的な「デザインパターン」(?)などをすべて理解するわけではないにしても、基本的な理解がほとんどないという事実と関係していると思います。

これが問題になります。私の現在のプロジェクトの一部は美しいスープを利用して簡単なスクレーパーを書くことです。処理されるデータは、以下に示すものと幾分類似した構造を有する。

<table> 
    <tr> 
     <td class="date">2011-01-01</td> 
    </tr> 
    <tr class="item"> 
     <td class="headline">Headline</td> 
     <td class="link"><a href="#">Link</a></td> 
    </tr> 
    <tr class="item"> 
     <td class="headline">Headline</td> 
     <td class="link"><a href="#">Link</a></td> 
    </tr> 
    <tr> 
     <td class="date">2011-01-02</td> 
    </tr> 
    <tr class="item"> 
     <td class="headline">Headline</td> 
     <td class="link"><a href="#">Link</a></td> 
    </tr> 
    <tr class="item"> 
     <td class="headline">Headline</td> 
     <td class="link"><a href="#">Link</a></td> 
    </tr> 
</table> 

主な問題は、私は単にどのように1まわりで私の頭を得ることができないということである)現在の日付(TR-> TDクラス=「日付」を追跡する)2間)内の項目をループします後続のtr:s(tr class = "item" - > td class = "headline"およびtr class = "item" - > td class = "link")、および3)処理されたデータを配列に格納する。

さらに、すべてのデータがデータベースに挿入され、各エントリには次の情報が含まれている必要があります。 CRUDこと

  • 見出し
  • リンク

注:データベースをINGのが問題の一部ではない、私はよりよい私がしようとしているものを説明するために、これを言及ここをクリックしてください:-)

ここでは、猫を肌に触れるさまざまな方法があります。だからこそ問題の解決策は本当に大歓迎ですが、この種の問題を「攻撃」するためにあなたが実際に使う論理と戦略について詳しく説明してくれれば非常に感謝しています。

最後に、このようなノービスの質問には申し訳ありません。

答えて

5

基本的な問題は、このテーブルがセマンティック構造ではなくルックアップ用にマークアップされていることです。適切に実行され、各日付とその関連項目は親を共有する必要があります。残念ながら、彼らはしないので、私たちはしなければなりません。

基本戦略は、そうでなければ、我々は見出しを抽出取得する最初のTABLEDATAはクラスの日付」を持っているならば、我々は日付の値を取得し、

  • last_seen_dateを更新し、テーブル内の各行を反復処理する

    • ですデータベースに保存(last_seen_date、見出し、リンク)を行います。
    import BeautifulSoup 
    
    fname = r'c:\mydir\beautifulSoup.html' 
    soup = BeautifulSoup.BeautifulSoup(open(fname, 'r')) 
    
    items = [] 
    last_seen_date = None 
    for el in soup.findAll('tr'): 
        daterow = el.find('td', {'class':'date'}) 
        if daterow is None:  # not a date - get headline and link 
         headline = el.find('td', {'class':'headline'}).text 
         link = el.find('a').get('href') 
         items.append((last_seen_date, headline, link)) 
        else:     # get new date 
         last_seen_date = daterow.text 
    
  • +0

    こんにちは、私はあなたの提案に行くことにしました、それは本当にうまくいった。お疲れ様でした! :-) – Mattias

    2

    Pythonパッケージに含まれているElement Treeを使用することができます。これを解析することにあなたの方法であなたを取得するのに十分であるべき

    http://docs.python.org/library/xml.etree.elementtree.html

    from xml.etree.ElementTree import ElementTree 
    
    tree = ElementTree() 
    tree.parse('page.xhtml') #This is the XHTML provided in the OP 
    root = tree.getroot() #Returns the heading "table" element 
    print(root.tag) #"table" 
    for eachTableRow in root.getchildren(): 
        #root.getchildren() is a list of all of the <tr> elements 
        #So we're going to loop over them and check their attributes 
        if 'class' in eachTableRow.attrib: 
         #Good to go. Now we know to look for the headline and link 
         pass 
        else: 
         #Okay, so look for the date 
         pass 
    

    +0

    ご挨拶ありがとうございます。私は現在、スクラップ目的でbeautifulsoupを使用していますが、おそらくいつでもElement Treeを調べます。乾杯! :-) – Mattias

    関連する問題