HTMLファイルの開始スクリプトタグと終了スクリプトタグを検出するために正規表現に従っています:
<script(?:[^<]+|<(?:[^/]|/(?:[^s])))*>(?:[^<]+|<(?:[^/]|/(?:[^s]))*)</script>
要するに: <script NOT</s > NOT</s </script>
動作しますが、 <script> を検出するのに非常に長い時間が必要です。長い文字列の場合は数分から数時間もかかります
ライトバージョンは長い文字列でも完璧に機能します:
<script[^<]*>[^<]*</script>
ただし、属性の値として < および > が可能な <a> などの他のタグにも使用する拡張パターン
あなたのためのpythonテスト:
import re
pattern = re.compile('<script(?:[^<]+|<(?:[^/]|/(?:[^s])))*>(?:[^<]+|<(?:[^/]|/(?:^s]))*)</script>', re.I + re.DOTALL)
re.search(pattern, '11<script type="text/javascript"> easy>example</script>22').group()
re.search(pattern, '<script type="text/javascript">' + ('hard example' * 50) + '</script>').group()
どうすれば修正できますか?正規表現の内部 (<script> の後) を変更して単純化する必要があります。
PS :) HTML解析で正規表現を使用するなどの間違ったアプローチについてのあなたの答えを予想してください。
コメント: まあ、ハンドルが必要です:
各 <a < document like this.border="5px;">
とアプローチはパーサーと正規表現を一緒に使用することです BeautifulSoup はわずか 2k 行で、すべての html を処理するのではなく、sgmllib から正規表現を拡張するだけです。
主な理由は、すべてのタグの開始位置と停止位置を正確に知る必要があるためです。すべての壊れた html を処理する必要があります。
BS は完全ではありません。時々起こります:
BeautifulSoup('< scriPt\n\n>a<aa>s< /script>').findAll('script') == [
] Python の re で利用できます。
とても非ゲーディーなすべて.*? この時点で<\s*/\s*tag\s*>が勝者となるまで。
その場合は完璧ではないことはわかっています: re.search('<\s*script. ?<\s /\s*script\s*>','< script </script> shit </script>') .group() しかし、次の解析で拒否されたテールを処理できます。
正規表現を使用した html の解析が 1 つの戦いではないことは明らかです。