【问题标题】:Python Regexp problemPython正则表达式问题
【发布时间】:2010-10-20 05:37:46
【问题描述】:

我正在尝试对网页中的一行进行正则表达式。该行如下:

<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

【问题讨论】:

    标签: python html regex


    【解决方案1】:

    使用正则表达式没有万无一失的方法。请参阅Can you provide some examples of why it is hard to parse XML and HTML with a regex? 了解原因。您需要的是一个 HTML 解析器,例如 HTMLParser:

    #!/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)
    

    【讨论】:

      【解决方案2】:

      听起来您可能想使用findall 而不是search

      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

      【讨论】:

        【解决方案3】:

        这个

        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
        

        这是你想要的吗?

        【讨论】:

        • 不完全。它在 ... 字符串被指定为 htmlbody 时起作用。但是在我的脚本中,htmlbody 是一个完整的 HTML 页面。在那种情况下,它似乎不起作用。我忘了告诉:页面包含此行的多个实例...
        • 你的意思是 可能在前一行吗?是否可以将其从正则表达式中排除?您可以尝试阅读所有行,将它们粘合在一起而没有换行符,并搜索所有出现的特定正则表达式。或者您可以尝试使正则表达式更通用。
        猜你喜欢
        相关资源
        最近更新 更多
        热门标签