我正在使用 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 的更好方法有所启发,那么我会很想知道这一点。