首先,我的英语不是我的母语。
我尝试使用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
如果您能指出正确的方向并链接一些我可能尚未完全调查的网站,那将非常有用。
答案 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
代替逗号(未经测试)。