0

我目前正在构建一个基本的 webscraper,它使用 Python 和 MechanicalSoup从National Rail获取火车票价格。

我正在尝试使用基本火车数据(起点和终点站,以及日期和时间)填写表格,以便我可以访问特定火车旅程的票价。

这是我用来填写表格的代码

import requests
from bs4 import BeautifulSoup
from bs4 import BeautifulSoup as Soup
import mechanicalsoup

#Mechanical soup
browser = mechanicalsoup.StatefulBrowser()
browser.open("http://www.nationalrail.co.uk/")

#Find the correct form
trainForm = browser.select_form('form[action="http://ojp.nationalrail.co.uk/service/planjourney/plan"]')

#Basic parameters (start and end, and date and time)
browser["from.searchTerm"]                              = "Norwich"
browser["to.searchTerm"]                                = "London Liverpool Street"
browser["timeOfOutwardJourney.monthDay"]                = "28/11/2018"
browser["timeOfOutwardJourney.hour"]                    = 13 
browser["timeOfOutwardJourney.minute"]                  = 15 
browser["_checkbox"]                                    = "off"                           

#Submit the form
browser.launch_browser()
response = browser.submit_selected()

#print the response
print(response)

我遇到的问题是,当表单提交时它返回<Response [400]>。研究使我相信我的表格填写不正确。但是,当browser.launch_browser()执行并打开我的浏览器时,所有字段似乎都已正确填写,如果我自己按提交,则表单已正确提交并打开正确的票价页面。

有谁知道我做错了什么?

4

1 回答 1

1

它只发生在 python3 中,问题是requests将重定向 URL 中的空格替换为%09

print(response.url)
# http://www.nationalrail.co.uk/times_fares/109179.aspx%09%09%09%09

你可以修补它,转到第 114 行

python_dir\Lib\site-packages\requests\sessions.py

并更换

location = location.encode('latin1')

location = location.strip().encode('latin1')
于 2018-11-28T06:34:43.080 回答