使用正则表达式从html文档中提取javascript

时间:2013-08-07 16:12:19

标签: python regex

我正在尝试使用正则表达式从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 个答案:

答案 0 :(得分:4)

这有效:

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>,那么您将需要此标记。

答案 1 :(得分:1)

如果您对第三方库没有疑问,requestsBeautifulSoup相结合可以实现更好的组合:

import requests
from bs4 import BeautifulSoup as bs
r = requests.get('http://www.google.com')
p = bs(r.content)
p.find_all('script')

答案 2 :(得分: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等人的话,这是最好的。

答案 3 :(得分:0)

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

rg = re.compile('<script>(.*)</script>', re.DOTALL)
result = re.findall(rg, gdoc)