代码之家  ›  专栏  ›  技术社区  ›  ʞɔıu

使用pyparsing查找以下标记

  •  4
  • ʞɔıu  · 技术社区  · 15 年前

    我正在使用pyparsing解析HTML。我抓住了所有 embed 标签,但在某些情况下 a 直接在后面加上标签,如果有,我也要抓取。

    例子:

    import pyparsing
    target = pyparsing.makeHTMLTags("embed")[0]
    target.setParseAction(pyparsing.withAttribute(src=pyparsing.withAttribute.ANY_VALUE))
    target.ignore(pyparsing.htmlComment)
    
    result = target.searchString(""".....
       <object....><embed>.....</embed></object><br /><a href="blah">blah</a>
       """)
    

    我在结果对象中找不到任何字符偏移量,否则我就可以从原始输入字符串中获取一部分并从中进行工作。

    编辑:

    有人问我为什么不用漂亮的汤。这是一个很好的问题,让我向您展示为什么我选择不将它与代码示例一起使用:

    import BeautifulSoup
    import urllib
    import re
    import socket
    
    socket.setdefaulttimeout(3)
    
    # get some random blogs
    xml = urllib.urlopen('http://rpc.weblogs.com/shortChanges.xml').read()
    
    success, failure = 0.0, 0.0
    
    for url in re.compile(r'\burl="([^"]+)"').findall(xml)[:30]:
        print url
        try:
            BeautifulSoup.BeautifulSoup(urllib.urlopen(url).read())
        except IOError:
            pass
        except Exception, e:
            print e
            failure += 1
        else:
            success += 1
    
    
    print failure / (failure + success)
    

    当我尝试这个的时候,BeautifulSoup由于解析错误而失败。 20-30%的时间 .这些不是罕见的边缘病例。Pyparsing很慢,也很麻烦,但是不管我怎么扔它,它都没有被炸毁。如果我能得到启发,找到一个更好的方法来使用漂亮的汤,那么我真的很有兴趣知道这一点。

    4 回复  |  直到 15 年前
        1
  •  5
  •   ʞɔıu    15 年前

    如果有可选的 <a> 如果它跟在 <embed> 标记,然后将其添加到搜索模式:

    embedTag = pyparsing.makeHTMLTags("embed")[0]
    aTag = pyparsing.makeHTMLTags("a")[0]
    target = embedTag + pyparsing.Optional(aTag)
    result = target.searchString(""".....   
        <object....><embed>.....</embed></object><br /><a href="blah">blah</a>
        """)
    
    print result.dump()
    

    如果要捕获解析程序中表达式的字符位置,请插入其中一个,并使用结果名称:

    loc = pyparsing.Empty().setParseAction(lambda s,locn,toks: locn)
    target = loc("beforeEmbed") + embedTag + loc("afterEmbed") + 
                                                     pyparsing.Optional(aTag)
    
        2
  •  1
  •   Ned Batchelder    15 年前

    为什么要编写自己的HTML解析器?标准库包括 HTMLParser 而且BeautifulSoup可以处理任何HTMLParser不能处理的工作。

        3
  •  1
  •   YOU    15 年前

    你不喜欢用普通的正则表达式吗?还是因为分析HTML的坏习惯?D

    re.findall("<object.*?</object>(?:<br /><a.*?</a>)?",a)
    
        4
  •  1
  •   gibson    15 年前

    我能运行你漂亮的代码,没有收到任何错误。我要喝漂亮的汤3.0.7a

    请使用BeautifulSoup 3.0.7a;3.1.0.1有缺陷,在某些情况下(如您的)根本无法工作。