当前位置:  开发笔记 > 编程语言 > 正文

使用pyparsing查找以下标记

如何解决《使用pyparsing查找以下标记》经验,为你挑选了1个好方法。

我正在使用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(""".....
   .....
blah """)

我无法在结果对象中找到任何字符偏移量,否则我只能抓取原始输入字符串的一部分并从那里开始工作.

编辑:

有人问为什么我不使用BeautifulSoup.这是一个很好的问题,让我告诉你为什么我选择不使用代码示例:

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是缓慢而繁琐的,但无论我扔什么,它都没有被炸毁.如果我能够更好地使用BeautifulSoup,那么我真的很想知道这一点.



1> PaulMcG..:

如果有一个可选标记,如果它跟在标记后会很有趣,那么将其添加到搜索模式中:

embedTag = pyparsing.makeHTMLTags("embed")[0]
aTag = pyparsing.makeHTMLTags("a")[0]
target = embedTag + pyparsing.Optional(aTag)
result = target.searchString(""".....   
    .....
blah """) print result.dump()

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

loc = pyparsing.Empty().setParseAction(lambda s,locn,toks: locn)
target = loc("beforeEmbed") + embedTag + loc("afterEmbed") + 
                                                 pyparsing.Optional(aTag)

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有