【问题标题】:How to 'react' to the response of a request using Python如何使用 Python 对请求的响应做出“反应”
【发布时间】:2016-10-04 23:41:37
【问题描述】:

我正在使用 Python 请求从德国铁路公司的移动网站 (https://mobile.bahn.de/bin/mobil/query.exe/dox') 获取信息

例如:

import requests
query = {'S':'Stuttgart Hbf', 'Z':'München Hbf'}
rsp = requests.get('https://mobile.bahn.de/bin/mobil/query.exe/dox',  params=query)

在这种情况下,它给出了正确的页面。

但是,使用以下查询:

query = {'S':'Cottbus', 'Z':'München Hbf'}

它给出了另一个响应,要求用户选择一个给定的选项(服务器对起始站感到困惑,因为有很多以“Cottbus”开头)

现在,我的问题是:鉴于此响应,我如何选择给定选项之一,然后重复请求而不会出现此错误?

我尝试查看 cookie,以使用会话而不是简单的获取请求。但到目前为止没有任何效果。

我希望你能帮助我。

谢谢。

【问题讨论】:

  • 我查看了网站,似乎使用 post 发送选项。所以你需要将相应的数据发布到网站上。
  • 这是真的。但这并不能解决问题。我的问题是特定于“Cottbus”的(请参阅下面的评论以更好地理解问题)

标签: python python-requests


【解决方案1】:

您可以使用 Beautifulsoup 来解析响应,如果响应中有选择,则可以获取选项:

import requests
from bs4 import BeautifulSoup

query = {'S': u'Cottbus', 'Z': u'München Hbf'}
rsp = requests.get('https://mobile.bahn.de/bin/mobil/query.exe/dox',  params=query)
soup = BeautifulSoup(rsp.content, 'lxml')

# check if has choice dropdown
if soup.find('select'):
    # Get list of tuples with text and input values that you will nee do use in the next POST request
    options_value = [(option['value'], option.text) for option in soup.find_all('option')]

【讨论】:

  • 感谢您的回答。更具体地说,问题在上面的示例中给出。 When choosing 'Cottbus' as the starting station, the first option given is also named 'Cottbus' !因此,通过使用相同名称发出新请求,不会发生任何变化。但是,例如 Chrome 中的情况并非如此。一旦选择了一个选项(即使它与最初给定的电台同名),它就可以工作!所以,我正在尝试模仿 Chrome,但到目前为止还没有找到!
  • 如果您想完全自动化浏览器的行为,请寻找 Selenium Webdriver
  • 那么使用 requests 包没有更简单的解决方案吗?
  • @AhmedAyadi,我不认为只使用请求。我仍然认为你可以使用我的方法来解决这个问题,使用 beautifulsoup。要知道您是否得到了正确的结果,您可以找到火车时刻表所在的元素。如果你没有找到它,按照我在这个答案中所说的去做
猜你喜欢
  • 2020-02-03
  • 2016-11-02
  • 2016-04-30
  • 2021-02-18
  • 2019-03-01
  • 1970-01-01
  • 2017-03-27
  • 2021-12-26
  • 1970-01-01
相关资源
最近更新 更多