【发布时间】:2021-09-22 23:55:22
【问题描述】:
我想使用 Python re 模块来获取 <script>...</script> 标签之间的内容。我使用re.search(r'<script>[\S\s]*</script>', myhtml) 搜索[\S\s]* 表示搜索任何字符串的内容。但是这个函数的行为很奇怪,它只返回了所需内容的一部分。所以我做一个小例子来说明我的意思。
import re
re.search('[\S\s]*','<!DOCTYPE HTML PUBLIC "-<!DO/W3C//DTD C 1.0Traitional//E')
所需的结果应该是'<!DOCTYPE HTML PUBLIC "-<!DO/W3C//DTD C 1.0Traitional//E',它是原始输入字符串。但是,它会打印 <_sre.SRE_Match object; span=(0, 56), match='<!DOCTYPE HTML PUBLIC "-<!DO/W3C//DTD C 1.0Traiti>。可以看出,字符串的最后一部分,即'onal//E' 丢失了。
这是为什么呢?如何提取标签之间的内容?
另外,有些人可能会建议我应该使用lxml 和BeautifulSoup,因为我也发现了一些奇怪的东西:
使用此代码:
from lxml import etree
rr='''
<script>
<div>
im here
</div>
</script>
'''
html = etree.HTML(rr, etree.HTMLParser())
print(html.xpath('//div//text()'))
上面的代码什么也没打印。如果我将<script> 更改为<script1>,那么它会按预期打印im here,并且BeautifulSoup 具有相同的行为。
【问题讨论】:
-
您看到的是匹配的一部分,因为
re.Match类的__repr__方法为了显示目的截断了字符串。尝试re.search(...).group(0)观看整场比赛。
标签: python beautifulsoup lxml re