当前位置: 首页 > 面试题库 >

Python无法使用urllib或机械化检索表单

仉俊能
2023-03-14
问题内容

我正在尝试使用Python填写并提交表单,但无法检索结果页面。我已经尝试过机械化和urllib / urllib2方法来发布表单,但是都遇到了问题。

我要检索的表单在这里:http:
//zrs.leidenuniv.nl/ul/start.php。该页面以荷兰语显示,但这与我的问题无关。可能值得注意的是,表单操作重定向到http://zrs.leidenuniv.nl/ul/query.php。

首先,这是我尝试过的urllib / urllib2方法:

import urllib, urllib2
import socket, cookielib

url = 'http://zrs.leidenuniv.nl/ul/start.php'
params = {'day': 1, 'month': 5, 'year': 2012, 'quickselect' : "unchecked",
          'res_instantie': '_ALL_', 'selgebouw': '_ALL_', 'zrssort': "locatie",
          'submit' : "Uitvoeren"}
http_header = {  "User-Agent" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11",
                 "Accept" : "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
                 "Accept-Language" : "nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4" }

timeout = 15
socket.setdefaulttimeout(timeout)

request = urllib2.Request(url, urllib.urlencode(params), http_header)
response = urllib2.urlopen(request)

cookies = cookielib.CookieJar()
cookies.extract_cookies(response, request)
cookie_handler = urllib2.HTTPCookieProcessor(cookies)
redirect_handler = urllib2.HTTPRedirectHandler()

opener = urllib2.build_opener(redirect_handler, cookie_handler)

response = opener.open(request)
html = response.read()

但是,当我尝试打印检索到的html时,我得到的是原始页面,而不是form动作所引用的页面。因此,任何关于为什么不提交表格的提示将不胜感激。

由于上述方法无效,因此我也尝试使用机械化方式提交表单。但是,这将导致ParseError包含以下代码:

import mechanize

url = 'http://zrs.leidenuniv.nl/ul/start.php'
br = mechanize.Browser()
response = br.open(url)
br.select_form(nr = 0)

最后一行以以下内容退出:“
ParseError:声明中出现意外的’-‘char”。现在,我意识到此错误可能表明DOCTYPE声明中存在错误,但是由于无法编辑表单页面,因此无法尝试其他声明。对此错误的任何帮助也将不胜感激。

在此先感谢您的帮助。


问题答案:

这是因为DOCTYPE零件格式不正确。

它还包含一些奇怪的标签,例如:

<!Co Dreef / Eelco de Graaff Faculteit der Rechtsgeleerdheid Universiteit Leiden><!e-mail j.dreef@law.leidenuniv.nl >

尝试自己验证页面…

尽管如此,您可以剥离垃圾使机械化的HTML解析器满意:

import mechanize

url = 'http://zrs.leidenuniv.nl/ul/start.php'

br = mechanize.Browser()
response = br.open(url)
response.set_data(response.get_data()[177:])
br.set_response(response)

br.select_form(nr = 0)


 类似资料:
  • 问题内容: 我有一个带有按钮的表单,希望能够单击它。 我已经尝试过,但是会出现以下错误: 也不起作用,因为它的类型是按钮并且不提交。 有任何想法吗?谢谢。 问题答案: 单击在 纯HTML 的形式什么都不做。为了执行任何操作,必须包含 javascript 。 并且不运行 javascript 。 因此,您的选择是: 自己阅读JavaScript并模拟其效果 使用运行JavaScript代码 我会做

  • 问题内容: 我想知道是否有类似Java的Perl / Python机械化的东西。 谢谢! 问题答案: 看看HtmlUnit。它类似于Perl的WWW :: Mechanize 。还有一个Perl版本,名为WWW :: HtmlUnit (它使用Inline :: Java 将Java库的方法公开给Perl)。

  • 问题内容: 我试图登录到http://www.magickartenmarkt.de网站,并在会员区域(https://www.magickartenmarkt.de/?mainPage=showWants)进行一些分析。我看到了其他示例,但是我不明白为什么我的方法行不通。我为第一种方法确定了正确的形式,但尚不清楚它是否有效。在第二种方法中,重播网页向我显示我无权访问会员区。 我很乐意提供任何帮助

  • 问题内容: 我对python机械化的代理支持有疑问。我正在制作一些Web客户端脚本,我想在我的脚本中插入代理支持功能。 例如,如果我有: 如何在我的机械化脚本中添加代理支持?每当我打开此网站时,我都希望它通过代理。 问题答案: 您使用mechanize.Request.set_proxy(host,type)(至少从0.1.11开始) 假设运行在localhost:8888的http代理 应该管用

  • 问题内容: 我正在尝试使用机械化提交表单,但遇到了错误(TypeError:ListControl,必须设置顺序)。在谷歌搜索了一段时间并尝试了几种不同的解决方案后,我无法解决该问题。我正在尝试提交所有字段。 通过机械化获取的表单数据(对于br.forms()打印中的f:f) 我当前的代码 请您协助并检查我是否为表单选项使用了正确的语法。谢谢 问题答案: 栏位会要求您提供整数清单,但您只提供一个整

  • 我正在尝试使用检索文件,同时添加自定义头。 检查我意识到可以在参数中获取对象,而不仅仅是一个字符串,从而可以放置我想要的标题。但是,如果我尝试对执行相同的操作,我会得到一个类型错误:预期的字符串或类似字节的对象,正如在另一篇文章中提到的。 我最终所做的是重写我自己的url检索,删除抛出错误的行(该行在我的用例中无关紧要)。 它工作得很好,但我想知道是否有更好/更干净的方法,而不是重写我自己的。如果