【问题标题】:Python and web-tags regexPython 和网络标签正则表达式
【发布时间】:2009-08-09 21:16:30
【问题描述】:

我需要网页内容。我需要从中获取一些数据。它看起来像:

数据

据我了解,我必须使用正则表达式,但我不能选择一个。

我尝试了下面的代码,但没有任何结果。请纠正我:

regexHandler = re.compile('(<div class="deg">(?P<div class="deg">.*?)</div>)')
result = regexHandler.search( pageData )

【问题讨论】:

    标签: python regex


    【解决方案1】:

    我建议使用一个好的 HTML 解析器(例如 BeautifulSoup - 但出于您的目的,即使用格式良好的 HTML 作为输入,Python 标准库附带的那些,例如 HTMLParser,也应该运行良好)而不是原始 RE 来解析 HTML。

    如果你想坚持原始的 RE 方法,模式:

    r'<div class="deg">([^<]*)</div>'
    

    看起来像是从字符串 '&lt;div class="deg"&gt;DATA&lt;/div&gt;' 中获取字符串 'DATA' 的最简单方法——假设这就是您所追求的。您可能需要在需要容忍可选空格的位置添加一个或多个 \s*

    【讨论】:

    • 为什么是更复杂的([^&lt;]*) 组?非贪婪的.*? 应该可以正常工作。
    • .*? 将容忍(并吸收)嵌入的标签,并且如果 div 包含另一个 div 内部(抓住内部目录的开始而不是结束),则会失去平衡,而模式 I建议只会在 div 包含纯文本数据时匹配,即没有嵌入标签,这在没有明确规范的情况下似乎更合理。此类复杂性是我开始推荐避免裸 RE 用于 HTML 解析的部分原因,并为此目的重用标准库和第三方模块中的许多优秀现有模块中的任何一个.
    • 我想,对问题的次优处理有不同的方法——在没有真正的解析器的情况下,你选择走更严格的路线,我选择走更宽松的路线;任何一个都有其优点和缺点。我同意某种形式的实际 DOM 解析器对于这个问题的一般情况来说会更理想,但这取决于 Ockonal 来决定,因为他是最了解他将获得的数据的人。感谢您的良好讨论。 :)
    • @Dav,是的,好点。我应该指出,众所周知,REs(除非扩展为比 REs 更多,就像在最近版本的 Perl 中一样)不能“用平衡括号解析”......这就是 XML 和 HTML 的全部意义所在,使 REs 尤其是不适合这样的任务(尽管人们一直在尝试!-)。
    • 谢谢。你的帖子对我来说非常有用。我稍后会了解它。
    【解决方案2】:

    如果您希望匹配项中包含 div 标签:

    regexpHandler = re.compile('(<div class="deg">.*?</div>)')
    

    如果您不想包含 div 标签,则只包含 DATA 部分:

    regexpHandler = re.compile('<div class="deg">(.*?)</div>')
    

    然后运行匹配并得到结果:

    result = regexHandler.search( pageData )
    matchedText = result.groups()[0]
    

    【讨论】:

    • 您的第二部分返回所有带有 标签的字符串。有什么想法吗?
    • 啊,抱歉 - 它必须是 result.groups()[0] 而不是 result.group() 才能获得捕获匹配,而不是匹配整个字符串。 :)
    【解决方案3】:

    你可以在 Python 中使用简单的字符串函数,不需要正则表达式

    mystr = """< div class="deg">DATA< /div>"""
    if "div" in mystr and "class" in mystr and "deg" in mystr:
        s = mystr.split(">")
        for n,item in enumerate(s):
            if "deg" in item:
                print s[n+1][:s[n+1].index("<")]
    

    我的方法,找点东西分开。例如,在上面,我拆分为“>”。然后遍历拆分的项目,检查“deg”,并获取它之后的项目,因为“deg”出现在您要获取的数据之前。当然,这不是唯一的方法。

    【讨论】:

      【解决方案4】:

      虽然可以使用 rexex 进行快速和肮脏的 html 处理,但更好和更清洁的方法是使用像 lxml.html 这样的 html 解析器并使用 XPathCSS Selectors 查询解析的树。

      html = """<html><body><div class="deg">DATA1</div><div class="deg">DATA2</div></body></html>"""
      
      import lxml.html
      
      page = lxml.html.fromstring(html)
      #page = lxml.html.parse(url)
      
      for element in page.findall('.//div[@class="deg"]'):
          print element.text
      
      #using css selectors
      from lxml.cssselect import CSSSelector
      sel = CSSSelector("div.deg")
      
      for element in sel(page):
          print element.text
      

      【讨论】:

      • 如果你需要使用 lxml.cssselect 和正则表达式来匹配一堆具有相似前缀的 ID 怎么办?可以合并吗?
      猜你喜欢
      • 1970-01-01
      • 2015-09-15
      • 2013-06-12
      • 2015-09-05
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多