2010-03-27 67 views
1
用正则表达式解析HTML

我的字符串是需要帮助蟒蛇

mystring = "<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 
100.00</span></td></tr>" 

我在这里的问题是我要寻找并获得总额

test = re.search("(Indian Rupees)(\d{2})(?:\D|$)", mystring) 

,但我的测试给我无。 我怎样才能获得的值和值可以是10.00,100.00,1000.00

感谢

回答

7

我强烈建议使用一个真正的HTML解析器对于这一点,而不是一个自定义的正则表达式。

下面是与BeautifulSoup库的例子:

from BeautifulSoup import BeautifulSoup 

str = r''' 
<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 100.00</span></td></tr> 
''' 

soup = BeautifulSoup(str) 

amount = soup.findAll('span', attrs={'class': 'para'}) 
amount_tokens = amount[0].text.split() 
print amount_tokens[-1] 
3

我第二伊莱的反应 - 你会更好使用HTML解析器。

个人而言,我会强烈建议lxml库解析HTML: http://lxml.de/

这是非常快,功能丰富。

from lxml.html import fromstring 

s = """ 
<tr><td><span class='para'><b>Total Amount : </b>INR (Indian Rupees) 
100.00</span></td></tr> 
""" 

doc = fromstring(s) 
for span in doc.cssselect('span.para'): 
    print span.text_content().split()[-1] 
+0

lxml非常适用于格式良好的HTML; BeautifulSoup非常适用于HTML。 – vy32 2010-03-27 06:12:30

+0

lxml可以很好的处理一个破碎的HTML,除非它是一个完整的“标签汤”当然是 – 2010-03-27 07:26:54

+1

@ vy32 lxml在许多方面比BS更好,当它不能使用BS的解析时(通过'lxml。 html.soupparser')。如果您想使用HTML5分析规则,它也可以使用html5lib('lxml.html.html5parser')。所以,使用lxml,它给你最多的选择,实际上是维护等。 – 2010-03-27 09:07:28

1

我同意一个解析器是一个伟大的路要走,但既然你问如何使用正则表达式做到这一点,这里有一个办法:

mystring = """<tr><td><span class='para'><b>Total Amount : 
</b>INR (Indian Rupees) 100.00</span></td></tr>""" 

test = re.search("\(Indian Rupees\) ([^<]+)", mystring) 

然后你会得到与号码:

test.group(1) 
+1

你应该读http://weblogs.asp.net/alex_papadimoulis/archive/2005/05/25/408925.aspx – 2010-03-27 09:17:25

+1

@Devin请阅读我的答案的第一行。我同意一个(HTML)解析器是要走的路(它已经被其他人发布了),但向求助者展示了如何修改他的代码以使其工作方式符合他希望的工作方式。希望提问者至少能学到更多关于正则表达式的知识,这不是一件坏事。不过谢谢你,虽然我觉得你建议的链接有点不合适,有点粗鲁。我明白了你的观点,但我希望你也明白我的观点。 – 2010-03-27 22:12:46

+0

知识并不总是一件好事。如果你只是想教育,还有更好的教导。例如,你可以解释为什么解析器是正确的,而正则表达式是错误的。他们不工作!它们很脆弱,根本无法处理HTML的全部功能。相反,你需要制定一个令牌,让他们知道它们可能不是正确的工具。但是,你并没有令人信服地支持这一点 - 即使你声称这一点,你将其余的帖子与行动相矛盾:基于正则表达式的解决方案。它发送错误的信息并启用错误的选择。这是错误的答案。 – 2010-03-28 03:45:57