2011-09-11 21 views
2

私は約50のテーブルを持つHTMLページを持っています。各テーブルには、同じレイアウトを持っていますが、異なる値、例えばと:python - HTMLテーブルを解析する方法

<table align="right" class="customTableClass"> 
<tr align="center"> 
<td width="25" height="25" class="usernum">value1</td> 
<td width="25" height="25" class="usernum">value2</td> 
<td width="25" height="25" class="usernum">value3</td> 
<td width="25" height="25" class="usernum">value4</td> 
<td width="25" height="25" class="usernum">value5</td> 
<td width="25" height="25" class="usernum">value6</td> 
<td width="25" height="25" class="totalnum">otherVal</td> 
</tr> 
</table> 

マイRESTサーバので、私のurls.pyに、私は明らかに私はすべてやりたい私のdef parse_url():関数を呼び出していますジャンゴ/のpythonを実行しています私の問題は、私はかなり多くの初心者は、Pythonになるので、文字通りちょうど私のコードを配置する場所を知りません。私はHTMLParserのpythonのドキュメントからいくつかのコードを得て、そして次のように変更されました:

import urllib, urllib2 
from django.http import HttpResponse 
from HTMLParser import HTMLParser 

    class MyHTMLParser(HTMLParser): 
     def handle_starttag(self, tag, attrs): 
      print "Encountered the beginning of a %s tag" % tag 

     def handle_endtag(self, tag): 
      print "Encountered the end of a %s tag" % tag 

     def handle_data(self, data): 
      HttpResponse("Encountered data %s" % data) 


    def parse_url(request): 
     p = MyHTMLParser() 
     url = 'http://www.mysite.com/lists.asp' 
     content = urllib.urlopen(url).read() 
     p.feed(content) 
     return HttpResponse('DONE') 

このコードは、現時点では、便利なdoesntの出力は何も。それはちょうどDONEを出力します、それは非常に有用ではありません。

handle_starttag()などのクラスメソッドを使用するにはどうすればよいですか?私がp.feed(content)を使用すると、これらは自動的に呼び出されますか?

value1 
value2 
value3 
value4 
value5 
value6 

othervalue 

これは、ループ内で行われる必要がある、ので:私はmysite.com/showlistに行くとき

基本的に、私は最終的に達成しようとしているものです、と言っリストを出力することができるようにします各テーブルには値が異なる約50のテーブルがあります。

初心者を助けてくれてありがとう!!

答えて

5

djangoではなく、stdoutへの回答の最初の部分を印刷しています。

import urllib, urllib2 
from django.http import HttpResponse 
from HTMLParser import HTMLParser 

class MyHTMLParser(HTMLParser): 
    def __init__(self, *args, **kwargs): 
     self.capture_data = False 
     self.data_list = [] 
     HTMLParser.__init__(self, *args, **kwargs) 

    def handle_starttag(self, tag, attrs): 
     if tag == 'td': 
      self.capture_data = True 

    def handle_endtag(self, tag): 
     if tag == 'td': 
      self.capture_data = False 

    def handle_data(self, data): 
     if self.capture_data and data and not data.isspace(): 
      self.data_list.append(data) 

def parse_url(request): 
    p = MyHTMLParser() 
    url = 'http://www.mysite.com/lists.asp' 
    content = urllib.urlopen(url).read() 
    p.feed(content) 
    return HttpResponse(str(p.data_list)) 

私はutils.pyファイルにクラスを入れて、あなたのviews.pyと同じフォルダに保つことをお勧めします:ここにHTMLParserはあなたの入札を行うために取得する方法です。それをインポートしてください。これは、ビューのみを管理することによってview.pyを管理しやすくするのに役立ちます。

+0

ありがとうございました。これは、私が探していた解決策のようです。それは働いているが、次のようなタブを印刷する:「\ r \ n \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ r \ n \ t \ t \ t \ t \ t \ t \ t \ t '、' \ r \ n \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t \ t ' t \ t \ t '、' 1 '、' t '、' t '、' t '、' t ' '10'、 '32'、 '35'、 '39'、 '45'、 '33'、 '。どのようにこれらをフィルタリングするか考えていますか? – eoinzy

+0

'class = usernum'または' class = totalnum'と一致するデータだけを検索することは可能ですか? – eoinzy

+0

メソッドにnot data.isspace()を追加しました。ノイズをフィルタリングする必要があります。 eoinzyの記述では、attrs varをチェックして追加のフィルタリングを行うことができます。 –

関連する問題