常见问题¶
一般¶
我需要哪个版本的python?¶
mechanize适用于所有python版本,python2(>=2.7)和3(>=3.5)。
mechanize需要什么依赖?¶
html5lib
mechanize使用什么许可证?¶
mechanize许可证 BSD-3-clause 许可证。
使用¶
我没有得到我希望看到的HTML页面?¶
见 调试 .
是否支持javascript?¶
不,对不起。参见 javascript正在破坏我的网络抓取。我该怎么办?
我的HTTP响应数据被截断了?¶
mechanize.Browser's 响应对象支持 .seek() 方法,并且在 .close() 已被调用。在需要响应数据之前,不会提取该数据,因此在提取所有响应之前从URL中导航出来会截断该数据。呼叫 response.get_data() 在导航之前,如果你不想这样。
是否有示例代码?¶
看看里面 examples/ 目录。请注意,表单页面上的示例可以按原样执行。欢迎您提供示例代码!
形式¶
如何确定要使用的控件名称和值?¶
print(form) 通常是你所需要的。在你的代码中, HTMLForm.items 属性 mechanize.HTMLForm
实例对于在运行时检查表单很有用。请注意,可以使用项目标签而不是项目名称,这很有用-使用 by_label 各种方法的参数,以及 .get_value_by_label() / .set_value_by_label() 方法对 ListControl .
那些是什么 '*' 在列表控件的字符串表示中,字符是指?¶
A * 项目旁边表示已选中该项目。
在列表控件的字符串表示形式中,这些括号(圆括号)意味着什么?¶
圆括号 (foo) 在项目周围表示该项目已禁用。
为什么不呢 <some control> 在返回的数据中显示 .click*() 当该控件具有非“无”值时?¶
该控件被禁用,或者由于其他原因未成功。“成功'(请参见 HTML 4 specification )表示控件将导致数据发送到服务器。
为什么mechanize不遵循HTML4.0/RFC1866标准 RADIO 以及多重选择 SELECT 控制?¶
因为在默认情况下,当在没有在HTML中显式选择项目的列表控件中设置最初选择的项目时,它遵循浏览器行为。
调试代码时遇到问题。¶
见 调试 .
我有一个包含整数列表的控件。如何选择值与所需值最接近的值?¶
import bisect
def closest_int_value(form, ctrl_name, value):
values = map(int, [item.name for item in form.find_control(ctrl_name).items])
return str(values[bisect.bisect(values, value) - 1])
form["distance"] = [closest_int_value(form, "distance", 23)]
其他¶
我想看看我的网络浏览器在做什么?¶
使用浏览器的开发人员工具(您可能需要先安装它们)。这些提供了浏览器中所有HTTP请求/响应的良好视图。
javascript正在破坏我的网络抓取。我该怎么办?¶
javascript在网页中的用途很多,例如:创建加载时不在网页中的内容,提交或填写部分表单以响应用户操作,设置cookie等。mechanize不提供任何对javascript的支持。
如果您在希望自动化的页面中遇到这种情况,那么您有几个选项。它们大致按照简单的顺序排列如下:
找出JavaScript正在做什么,并在您的Python代码中模拟它。最简单的情况是如果javascript正在设置一些cookie。在这种情况下,您可以检查浏览器中的cookie并模拟将其设置为mechanize
mechanize.Browser.set_simple_cookie()
.更复杂的是使用浏览器开发人员工具来准确查看浏览器发送的请求,并使用
mechanize.Request
手动创建请求并用打开它mechanize.Browser.open()
.第三,使用一些浏览器自动化框架/库来刮取站点,而不是使用mechanize。这些库通常驱动可以执行所有javascript的完整浏览器的无头版本。它们通常比使用mechanize慢得多,而且资源密集得多,但作为最后手段,它们确实工作。