我正在使用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>
""")
我无法在结果对象中找到任何字符偏移量,否则我只能抓取一段原始输入字符串并从那里开始工作。
编辑:
有人问为什么我不使用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,那么我真的很想知道这一点。
答案 0 :(得分:5)
如果有可选的<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)
答案 1 :(得分:1)
为什么要编写自己的HTML解析器?标准库包含HTMLParser,BeautifulSoup可以处理HTMLParser无法处理的任何作业。
答案 2 :(得分:1)
re.findall("<object.*?</object>(?:<br /><a.*?</a>)?",a)
答案 3 :(得分:1)
我能够运行您的BeautifulSoup代码并且没有收到任何错误。我正在运行BeautifulSoup 3.0.7a
请使用BeautifulSoup 3.0.7a; 3.1.0.1有一些错误,在某些情况下(例如你的)会阻止它工作。