2024-06-16 11:34:21 发布
网友
我试图使用正则表达式从google.com中提取java脚本。在
google.com
程序
import urllib import re gdoc = urllib.urlopen('http://google.com').read() scriptlis = re.findall(r'<script>(.*?)</script>', gdoc) print scriptlis
输出:
有谁能告诉我如何只用正则表达式从html文档中提取java脚本吗。在
这是有效的:
import urllib import re gdoc = urllib.urlopen('http://google.com').read() scriptlis = re.findall('(?si)<script>(.*?)</script>', gdoc) print scriptlis
这里的键是(?si)。“s”设置“dotall”标志(与re.DOTALL相同),它使Regex在换行符上匹配。这实际上是你问题的根源。上的脚本谷歌跨越多行,所以Regex不能匹配它们,除非您告诉它在(.*?)中包含新行。在
(?si)
re.DOTALL
(.*?)
“i”设置“ignorcase”标志(与re.IGNORECASE相同),它允许它匹配任何可以是JavaScript的内容。现在,这不是完全必要的,因为Google的代码很好。但是,如果您有一些糟糕的代码执行类似于<SCRIPT>...</SCRIPT>的代码,那么您将需要这个标志。在
re.IGNORECASE
<SCRIPT>...</SCRIPT>
我认为问题是<script>和{}之间的文本是几行,所以您可以尝试这样的方法:
<script>
rg = re.compile('<script>(.*)</script>', re.DOTALL) result = re.findall(rg, gdoc)
如果您对第三方库没有问题,^{}与^{}结合在一起是一个很好的组合:
import requests from bs4 import BeautifulSoup as bs r = requests.get('http://www.google.com') p = bs(r.content) p.find_all('script')
这是有效的:
这里的键是
(?si)
。“s”设置“dotall”标志(与re.DOTALL
相同),它使Regex在换行符上匹配。这实际上是你问题的根源。上的脚本谷歌跨越多行,所以Regex不能匹配它们,除非您告诉它在(.*?)
中包含新行。在“i”设置“ignorcase”标志(与
re.IGNORECASE
相同),它允许它匹配任何可以是JavaScript的内容。现在,这不是完全必要的,因为Google的代码很好。但是,如果您有一些糟糕的代码执行类似于<SCRIPT>...</SCRIPT>
的代码,那么您将需要这个标志。在我认为问题是}之间的文本是几行,所以您可以尝试这样的方法:
<script>
和{如果您对第三方库没有问题,^{} 与^{} 结合在一起是一个很好的组合:
相关问题 更多 >
编程相关推荐