如何解析包含JavaScript代码的HTML

6 投票
3 回答
5521 浏览
提问于 2025-04-16 23:36

如何解析那些大量使用JavaScript的HTML文档呢?我知道在Python中有一些库可以解析静态的XML/HTML文件,我其实是在寻找一个程序或库(甚至是Firefox插件),它能够读取HTML和JavaScript,执行JavaScript部分,然后输出没有JavaScript的HTML代码,这样在浏览器中显示出来的效果就一模一样了。

举个简单的例子

<a href="javascript:web_link(34, true);">link</a>

应该被JavaScript函数返回的相应值替换,比如说

<a href="http://www.example.com">link</a>

一个更复杂的例子是保存的Facebook HTML页面,上面满是各种JavaScript代码。

这可能和 如何用Node.js“执行”HTML+JavaScript页面 有关,但我真的需要Node.js和JSDOM吗?还有一点相关的是 用于渲染HTML和JavaScript的Python库,不过我并不想渲染,只想要纯粹的HTML输出。

3 个回答

0

PhantomJS 可以通过 Selenium 来加载。

$ ipython

In [1]: from selenium import webdriver

In [2]: browser=webdriver.PhantomJS()

In [3]: browser.get('http://seleniumhq.org/')

In [4]: browser.title
Out[4]: u'Selenium - Web Browser Automation'
2

来自 Mozilla Gecko 常见问题解答

问:我可以从 Unix shell 脚本中调用 Gecko 引擎吗?我能否发送 HTML 并得到一个可以打印的网页?

答:其实不太支持;不过你可以通过使用 Gecko 的嵌入 API 自己写一个应用程序,可能能接近你想要的效果。需要注意的是,目前没有屏幕上的小部件来渲染内容的话,是无法打印的。

在一个程序中 嵌入 Gecko 以输出你想要的内容可能会显得有些复杂,但至少你的输出效果会尽可能好。

3

你可以使用Selenium这个工具来配合Python进行操作,具体的使用方法可以在这里找到。

下面是一个例子:

import xmlrpclib

# Make an object to represent the XML-RPC server.
server_url = "http://localhost:8080/selenium-driver/RPC2"
app = xmlrpclib.ServerProxy(server_url)

# Bump timeout a little higher than the default 5 seconds
app.setTimeout(15)

import os
os.system('start run_firefox.bat')

print app.open('http://localhost:8080/AUT/000000A/http/www.amazon.com/')
print app.verifyTitle('Amazon.com: Welcome')
print app.verifySelected('url', 'All Products')
print app.select('url', 'Books')
print app.verifySelected('url', 'Books')
print app.verifyValue('field-keywords', '')
print app.type('field-keywords', 'Python Cookbook')
print app.clickAndWait('Go')
print app.verifyTitle('Amazon.com: Books Search Results: Python Cookbook')
print app.verifyTextPresent('Python Cookbook', '')
print app.verifyTextPresent('Alex Martellibot, David Ascher', '')
print app.testComplete()

撰写回答