5

Pythonを使用してフォームに入力して送信しようとしていますが、結果のページを取得できません。mechanizeメソッドと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を印刷しようとすると、フォームアクションが参照しているページではなく、元のページが表示されます。したがって、これがフォームを送信しない理由に関するヒントをいただければ幸いです。

上記がうまくいかなかったので、私もmechanizeを使ってフォームを送信しようとしました。ただし、これにより、次のコードでParseErrorが発生します。

import mechanize

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

ここで、最後の行は次のように終了します: "ParseError:unexpected'-' charindeclaration"。このエラーはDOCTYPE宣言のエラーを示している可能性があることに気付きましたが、フォームページを編集できないため、別の宣言を試すことができません。このエラーに関するヘルプも大歓迎です。

よろしくお願いします。

4

1 に答える 1

1

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)
于 2012-09-10T13:52:59.777 に答える