使用MechanicalSoup访问隐藏表单将导致"值错误:没有收盘报价"

时间:2018-03-21 13:35:17

标签: python html beautifulsoup python-requests mechanicalsoup

首先,我的英语不是我的母语。

问题

我尝试使用MechanicalSoup访问和操作表单,如docs中所述。我使用给定的登录表单成功登录页面,我使用"调试模式"(F12)内置到chrome中。

form action="https://www.thegoodwillout.de/customer/account/loginPost/"

可以使用chrome"调试器"

找到 here 的表单

这工作正常,不会产生任何错误。我尝试升级游戏并转移到 this 网站上提供的更复杂的表单。我设法将表单跟踪到此代码段

form action="https://www.thegoodwillout.de/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudGhlZ29vZHdpbGxvdXQuZGUvbmlrZS1haXItdm9ydGV4LXNjaHdhcnotd2Vpc3MtYW50aHJheml0LTkwMzg5Ni0wMTA_X19fU0lEPVU,/product/115178/form_key/r19gQi8K03l21bYk/"

这将导致

ValueError: No Closing quotation

这很奇怪,因为它不使用任何特殊字符,我仔细检查,以便每个报价正确关闭

我尝试了什么

我尝试追踪一个更具体的表格,该表格将适用于给定的鞋码,但此表格似乎管理了网站上的所有内容。我搜索了网页,发现几篇文章指向python里面的 bug ,我不敢相信这是真的!

附带错误日志的源代码

import mechanicalsoup

browser = mechanicalsoup.StatefulBrowser()
browser.open("https://www.thegoodwillout.de/nike-air-vortex-schwarz-weiss-anthrazit-903896-010")
browser.select_form('form[action="https://www.thegoodwillout.de/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudGhlZ29vZHdpbGxvdXQuZGUvbmlrZS1haXItdm9ydGV4LXNjaHdhcnotd2Vpc3MtYW50aHJheml0LTkwMzg5Ni0wMTA_X19fU0lEPVU,/product/115178/form_key/r19gQi8K03l21bYk/"]')
  

注意:这一切似乎都追溯到一个名为shlex的模块,导致错误

最后 error log

如果您能指出正确的方向并链接一些我可能尚未完全调查的网站,那将非常有用。

1 个答案:

答案 0 :(得分:0)

这实际上是BeautifulSoup4的问题,这是MechanicalSoup用于在HTML文档中导航的库,与您在CSS选择器中使用逗号(,)相关。

BeautifulSoup在逗号上拆分CSS选择器,因此将您的查询视为:browser.select_form('form[action="https://www.thegoodwillout.de/checkout/cart/add/uenc/aHR0cHM6Ly93d3cudGhlZ29vZHdpbGxvdXQuZGUvbmlrZS1haXItdm9ydGV4LXNjaHdhcnotd2Vpc3MtYW50aHJheml0LTkwMzg5Ni0wMTA_X19fU0lEPVU/product/115178/form_key/r19gQi8K03l21bYk/"],单独解析。在解析第一个时,它会找到一个开头"但没有关闭",并且输出错误。

这是一个功能(你可以指定多个CSS选择器作为select的参数),但它在这里作为一个功能没用(当你期望一个对象时,没有必要提供几个选择器)。

解决方案:不要在CSS选择器中使用逗号。您可能还有其他标准可以匹配您的表单。

您可以尝试使用%2C代替逗号(未经测试)。