Я использую 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, мне было бы очень интересно это узнать.
bad end tag: u"</scr' + 'ipt>"
иmalformed start tag
. - person ʞɔıu   schedule 20.11.2009