我已经按照正则表达式来检测 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 解析中使用正则表达式,我非常了解许多 html/xml 解析器,甚至更好的是我可以在经常损坏的 html 代码中期待什么,正则表达式在这里非常有用。
评论:好吧,我需要句柄:
每个 <a < document like this.border="5px;">
和方法是一起使用解析器和正则表达式 BeautifulSoup 只有 2k 行,它不能处理每个 html 并且只是从 sgmllib 扩展正则表达式。
主要原因是我必须准确知道每个标签开始和停止的位置。并且必须处理每个损坏的 html。
BS 并不完美,有时会发生:
BeautifulSoup('< scriPt\n\n>a<aa>s< /script>').findAll('script') == []
@Cylian:你知道的原子分组不是在python的re中可用。
一切都那么令人讨厌。*?直到此时<\s*/\s*tag\s*>是赢家。
我知道在这种情况下并不完美: re.search('<\s*script. ?<\s /\s*script\s*>','< script </script> shit </script>') .group() 但我可以在下一次解析中处理被拒绝的尾部。
很明显,使用正则表达式进行 html 解析并不是一场战斗。