Използвам 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="/bgblah">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, тогава наистина ще ми е интересно да знам това.
bad end tag: u"</scr' + 'ipt>"
иmalformed start tag
. - person ʞɔıu   schedule 20.11.2009