HTMLを解析するためにpyparsingを使用しています。私はすべてのタグを取得しています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)
これを試してみると、 20 ~ 30% の確率で BeautifulSoup が解析エラーで失敗します。これらはまれなエッジ ケースではありません。pyparsing は遅くて面倒ですが、何を投げても爆発しませんでした。BeautifulSoup のより良い使用方法について教えていただければ、それを知りたいと思います。