Javascript 使用Python从html中的脚本对象函数获取文本/属性
我一直在一个网站上做网页抓取,在那里我需要获取javascript,这样我就可以提取数据,如名称、创建日期和一些随机生成的代码,如下所示 是否有一种有效/任何方法可以从html网页的Javascript 使用Python从html中的脚本对象函数获取文本/属性,javascript,python,html,beautifulsoup,Javascript,Python,Html,Beautifulsoup,我一直在一个网站上做网页抓取,在那里我需要获取javascript,这样我就可以提取数据,如名称、创建日期和一些随机生成的代码,如下所示 是否有一种有效/任何方法可以从html网页的中的脚本对象函数中获取文本/属性 我能够使用BeautifulSoup找到脚本部分,其中嵌入的函数如下所示: <script type="text/javascript"> //COMMENT// Some data already here $(document).ready(f
中的脚本对象函数中获取文本/属性
我能够使用BeautifulSoup找到脚本部分,其中嵌入的函数如下所示:
<script type="text/javascript">
//COMMENT// Some data already here
$(document).ready(function() {
name.init("<website Link>")
lang.init("en", "GB")
data.init("hello", "", "AT3K21SDV", "YIERE34ITEW832WCNG3VMASJKHO345JKRELRK5", "")
});
</script>
//注释//此处已有一些数据
$(文档).ready(函数(){
name.init(“”)
lang.init(“en”、“GB”)
init(“你好”,“AT3K21SDV”,“YIERE34ITEW832WCNG3VMASJKHO345JKRELRK5”,“IIERE34ITEW832WCNG3VMASJKHO345JKRELRK5”)
});
具体来说,我需要获得$(document).ready(function()
部分,其中包括AT3K21SDV
和yiere34itew832wcng3vmasjkho345jkrerk5
我一直在绞尽脑汁,试图用这样的索引来获取它;`soup[3:40]但不起作用
beautifulsoup
不解析JavaScript,所以你需要使用其他工具。例如re
来提取信息:
import re
from ast import literal_eval
txt = '''<script type="text/javascript">
//COMMENT// Some data already here
$(document).ready(function() {
name.init("<website Link>")
lang.init("en", "GB")
data.init("hello", "", "AT3K21SDV", "YIERE34ITEW832WCNG3VMASJKHO345JKRELRK5", "")
});
</script>'''
data = re.search(r'data\.init(\(.*?\))', txt).group(1)
data = literal_eval(data)
print(data[2], data[3])
编辑:如果内部
data.init(…)
是换行符,则必须在re.search()中设置flags=re.DOTALL
:
beautifulsoup
不解析JavaScript,因此需要使用其他工具。例如re
提取信息:
import re
from ast import literal_eval
txt = '''<script type="text/javascript">
//COMMENT// Some data already here
$(document).ready(function() {
name.init("<website Link>")
lang.init("en", "GB")
data.init("hello", "", "AT3K21SDV", "YIERE34ITEW832WCNG3VMASJKHO345JKRELRK5", "")
});
</script>'''
data = re.search(r'data\.init(\(.*?\))', txt).group(1)
data = literal_eval(data)
print(data[2], data[3])
编辑:如果内部data.init(…)
是换行符,则必须在re.search()中设置flags=re.DOTALL
:
我在data=re.search(r'data\.init(\(.*?))),txt)行中得到了AttributeError:'NoneType'对象没有属性'group'
。group(1)
因为我已经使用BeautifulSoup获得了javascript部分,所以我做了txt=str(javaScriptData)
其中javaScriptData
包含sectiom@Legion如果出现此错误,则变量txt
不包含字符串data.init(…)
。您需要检查这种可能性。@Andej Kesely如果字符串更长;mywebsite.data.init(…)
,然后我包含的搜索是re.search(r'mywebsite\.data\.init(\(.*?)),txt)。组(1)
哪一个应该是正确的..不确定,但可能是因为我在前面的步骤中使用了BeautifulSoup
。@Legion是的,你可以这样做。有一个网站Regex101,你可以在那里尝试你的正则表达式:把字符串和正则表达式放在那里,看看它是否有效。@Andej Kesely这与缩进格式有关(如图所示,它将其视为一个换行符。有没有办法自动重新格式化代码?我得到了AttributeError:'NoneType'对象在data=re.search(r'data\.init(\(.*?))),txt.group(1)
行中没有属性“group”
,因为我已经使用BeautifulSoup获得了javascript部分,所以我得到了txt=str。)(javaScriptData)
其中javaScriptData
包含sectiom@Legion如果出现此错误,则变量txt
不包含字符串data.init(…)
。您需要检查这种可能性。@Andej Kesely如果字符串更长;mywebsite.data.init(…)
,然后我包含的搜索是re.search(r'mywebsite\.data\.init(\(.*?)),txt)。组(1)
哪一个应该是正确的..不确定,但可能是因为我在前面的步骤中使用了BeautifulSoup
。@Legion是的,你可以这样做。有一个网站Regex101,你可以在那里尝试你的正则表达式:把字符串和正则表达式放在那里,看看它是否有效。@Andej Kesely这与缩进格式有关(它将其视为此处所示的换行符。是否有方法自动重新格式化代码?
import re
from ast import literal_eval
txt = '''<script type="text/javascript">
//COMMENT// Some data already here
$(document).ready(function() {
ab.info.init("sv", "pp", "f", "NONE",
"rw", "3r7u6565667",
"3435345")
});
</script>'''
data = re.search(r'info\.init(\(.*?\))', txt, flags=re.DOTALL).group(1)
data = literal_eval(data)
print(data)
('sv', 'pp', 'f', 'NONE', 'rw', '3r7u6565667', '3435345')