如何用Python加载HTML文件并运行其中的JS函数获取返回值?
解决方法
问题根源
js2py默认未模拟浏览器DOM环境,直接运行包含document相关代码的HTML文件时,会因找不到document对象报错,导致代码无法正常执行。bigger函数仅修改全局变量result,没有返回值,直接调用tt.bigger()无法获取结果,需从全局作用域中读取result。
实现方案
方案一:提取核心JS代码运行
直接剥离HTML中不需要的DOM相关代码,仅运行核心逻辑:
import js2py # 提取HTML中script标签内的核心JS代码(移除DOM绑定部分) core_js = """ var result = null; function bigger(x, y) { result = 'font '+x+' got bigger by '+y; console.log(result) } """ # 创建JS执行上下文并运行代码 js_context = js2py.EvalJs() js_context.execute(core_js) # 调用函数并获取全局变量结果 target_str = "Hello World" target_size = 120 js_context.bigger(target_str, target_size) final_result = js_context.result print(final_result) # 输出:font Hello World got bigger by 120
方案二:模拟DOM环境运行完整HTML
如果需要保留原HTML的完整代码,可模拟空DOM对象避免报错:
import js2py from bs4 import BeautifulSoup # 读取本地HTML文件 with open('c://file.htm', 'r', encoding='utf-8') as file: html_content = file.read() # 提取script标签内的JS代码 soup = BeautifulSoup(html_content, 'html.parser') raw_js = soup.find('script').string # 添加模拟DOM的代码,避免document相关报错 mock_dom_code = """ var document = { getElementById: function() { return { onclick: function() {} }; } }; """ full_js_code = mock_dom_code + raw_js # 执行JS代码并调用函数 js_context = js2py.EvalJs() js_context.execute(full_js_code) target_str = "Hello World" target_size = 120 js_context.bigger(target_str, target_size) print(js_context.result) # 输出预期结果
注意事项
- 使用方案二需先安装BeautifulSoup4:
pip install beautifulsoup4 - 模拟DOM仅为避免代码执行报错,原HTML中的
onclick绑定逻辑不会影响函数调用。
内容的提问来源于stack exchange,提问作者yvgwxgtyowvaiqndwo
相关产品推荐
相关产品推荐

