我正在使用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,那么我真的很想知道这一点.
如果有一个可选标记,如果它跟在
标记后会很有趣,那么将其添加到搜索模式中:
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)