2

我正在尝试从google.com使用正则表达式中提取 java 脚本。

程序

import urllib
import re
gdoc = urllib.urlopen('http://google.com').read()
scriptlis = re.findall(r'<script>(.*?)</script>', gdoc)
print scriptlis

输出:

['']

谁能告诉我如何仅使用正则表达式从 html doc 中提取 java 脚本。

4

4 回答 4

5

这有效:

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),这使得正则表达式匹配换行符。这实际上是你问题的根源。google.com 上的脚本跨越多行,因此 Regex 无法匹配它们,除非您告诉它在(.*?).

“i”设置了“ignorcase”标志(与 相同re.IGNORECASE),这允许它匹配任何可以是 JavaScript 的东西。现在,这并不是完全必要的,因为 Google 的代码非常好。但是,如果你有糟糕的代码来做类似的事情<SCRIPT>...</SCRIPT>,你将需要这个标志。

于 2013-08-07T16:25:15.987 回答
1

如果您对第三方库没有任何疑问,那么requests结合使用BeautifulSoup可以实现很好的组合:

import requests
from bs4 import BeautifulSoup as bs
r = requests.get('http://www.google.com')
p = bs(r.content)
p.find_all('script')
于 2013-08-07T16:34:55.987 回答
0

您可能可以尝试做的是

scriptlis = re.findall(r'<script\s*([^>]*)\s*>(.*?)</script', gdoc, re.I|re.S)

因为大多数脚本标签都是类型:

<script language="javascript" src="foo"></script>

或者

<script language="javascript">alert("foo")</script>

有些甚至是<SCRIPT></SCRIPT>

两者都不匹配您的正则表达式。我的正则表达式将获取第 1 组中的属性,以及第 2 组中可能的内联代码。以及 HTML 注释中的所有标签。但如果没有 BeautifulSoup 等人,这是最好的

于 2013-08-07T16:17:48.610 回答
0

我认为问题在于 and 之间的文本<script></script>几行,所以你可以尝试这样的事情:

rg = re.compile('<script>(.*)</script>', re.DOTALL)
result = re.findall(rg, gdoc)
于 2013-08-07T16:22:32.670 回答