2009-04-17 5 views
0

私は、Webページから行を正規表現しようとしています。次のように行は次のとおりです。Python Regexp problem

<tr><td width=60 bgcolor='#ffffcc'><b>random Value</b></td><td align=center width=80> 

これは私が試したものですが、動作するようには思えない、誰も私を助けることができますか? 'htmlbody'にはhtmlページが含まれていますが、私は 're'をインポートすることを忘れませんでした。

reg = re.compile("<tr><td width=60 bgcolor='#ffffcc'><b>([^<]*)</b></td><td align=center width=80>") 
value = reg.search(htmlbody) 
print 'Value is', value 

答えて

1

あなたはむしろsearchよりfindallを使用する場合がありますようですね:

reg = re.compile("<tr><td width=60 bgcolor='#ffffcc'><b>([^<]*)</b></td><td align=center width=80>") 
value = reg.findall(htmlbody) 
print 'Found %i match(es)' % len(value) 

私は正規表現が悪名高くしていること、しかし、ご承知願いしなければなりませんHTMLの処理に貧弱です。 HTMLParser module built in to Pythonを使用して適切なパーサーを使用する方がよいでしょう。

1

この

import re 

htmlbody = "<tr><td width=60 bgcolor='#ffffcc'><b>random Value</b></td><td align=center width=80>" 

reg = re.compile("<tr><td width=60 bgcolor='#ffffcc'><b>([^<]*)</b></td><td align=center width=80>") 
value = reg.search(htmlbody).group(1) 
print 'Value is', value 

版画これはあなたが望むものを

Value is random Value 

ですか?

+0

完全ではありません。 ...文字列がhtmlbodyに指定されているときに動作します。しかし、私のスクリプトでは、htmlbodyはHTMLページ全体です。そして、その場合、それは動作していないようです。ページにはこの行の複数のインスタンスが含まれています... – MarcoW

+0

は前の行にある可能性がありますか? regexpから除外することは可能ですか?すべての行を読んでみると、行線を使わずにそれらを接着し、特定のregexpのすべての出現を検索することができます。あるいは正規表現をより一般的なものにしようとすることもできます。 – clorz

4

正規表現でこれを行う方法はありません。理由はCan you provide some examples of why it is hard to parse XML and HTML with a regex?を参照してください。何が必要HTMLParserのようなHTMLパーサーです:

#!/usr/bin/python 

from HTMLParser import HTMLParser 

class FindTDs(HTMLParser): 
     def __init__(self): 
       HTMLParser.__init__(self) 
       self.level = 0 

     def handle_starttag(self, tag, attrs): 
       if tag == 'td': 
         self.level = self.level + 1 

     def handle_endtag(self, tag): 
       if tag == 'td': 
         self.level = self.level - 1 

     def handle_data(self, data): 
       if self.level > 0: 
         print data 

find = FindTDs() 

html = "<table>\n" 
for i in range(3): 
     html += "\t<tr>" 
     for j in range(5): 
       html += "<td>%s.%s</td>" % (i, j) 
     html += "</tr>\n" 
html += "</table>" 

find.feed(html)