Html 在 requests.post 之后奇怪地回来了

Html comes back weird after requests.post

我想获得所有选项 value="5653923ac7eb6e355878bfe6 的列表,但我似乎无法对 bs4 使用最简单的解析方法。 我很困惑! 所有这些打印都是空括号 []

这是我的代码:

dropdown_text = s.post(base_url+watchlist_url+get_user_watch_url, data=data)
#Get list of wanted market ids
soup = bs(dropdown_text.text,'lxml')
print(soup)
#pprint.pprint(soup)
test = soup.find('body')
print(test)
test = soup.findAll('option',{"value": 'US - Dow Jones Industrials Index'})[0]
print(test)
<html><body><p>{"Html":"\r\n\r\n\u003cinput name=\"__RequestVerificationToken\" type=\"hidden\" value=\"4kKsQ_RWnpHMezsKWCJpcnhN45rqz5wJ96JPRLcbA4r2x_Mpc8UlvP0SleR93TRexSqg1sYIBSLuIAkd1AfjQXM6q_lXjM3BkJXj9Hyn_OcKLvFCc3g25Fpv7pKrKM-3Mv1QpH7VzZRGzDLfm-gf4Q2\" /\u003e\r\n\r\n\u003cdiv class=\"inner-01\"\u003e\r\n\u003cform class=\"form form-01 try-001\" id=\"analysisForm\"\u003e\r\n    Select a Market from Your Watchlist:\r\n    \u003cdiv class=\"type\"\u003e\r\n        \u003cselect id=\"WatchlistItem\" name=\"WatchlistItem\"\u003e\u003coption value=\"\"\u003eSelect Market\u003c/option\u003e\r\n\u003coption selected=\"selected\" value=\"In Order\"\u003eShow All - In Order\u003c/option\u003e\r\n\u003coption value=\"A-Z\"\u003eShow All - Alphabetical A-Z\u003c/option\u003e\r\n\u003coption value=\"Z-A\"\u003eShow All - Alphabetical Z-A\u003c/option\u003e\r\n\u003coption value=\"5653923ac7eb6e355878bfe6\"\u003eUS - S\u0026amp;P 500 Index\u003c/option\u003e\r\n\u003coption value=\"5a2b420decfdc711085dc51d\"\u003eBitcoin Per USD\u003c/option\u003e\r\n\u003coption value=\"5653923ac7eb6e355878bfeb\"\u003eUS - Dow Jones Industrials Index\u003c/option\u003e\r\n\u003coption value=\"5a8e2222ecfdc7197c27d1a3\"
etc

@HedgeHog Good idea but it returns the exact same thing

不完全一样,现在你根据你的例子操作正确soup问题可能需要一些改进,因为它不能完全重现

主要问题:

  1. 你的例子尝试像字符串
  2. 一样对字典/JSON进行操作
  3. 你的选择soup.findAll('option',{"value": 'US - Dow Jones Industrials Index'})正在寻找一个应该等于US - Dow Jones Industrials Index的属性value但是没有,它是标签的文本。

在较新的代码中避免使用旧语法 findAll() 而是使用 find_all() - 更多信息请花一分钟查看 check docs

以下应该修复行为,我使用 css selectors 而不是 find_all(),因为它对我来说更方便:

...
dropdown_text = s.post(base_url+watchlist_url+get_user_watch_url, data=data)

soup = bs(dropdown_text.json()['Html'])
soup.select('option:-soup-contains("US - Dow Jones Industrials Index")')[0].get('value')
...
例子
from bs4 import BeautifulSoup
import requests

soup = BeautifulSoup({"Html":"\r\n\r\n\u003cinput name=\"__RequestVerificationToken\" type=\"hidden\" value=\"4kKsQ_RWnpHMezsKWCJpcnhN45rqz5wJ96JPRLcbA4r2x_Mpc8UlvP0SleR93TRexSqg1sYIBSLuIAkd1AfjQXM6q_lXjM3BkJXj9Hyn_OcKLvFCc3g25Fpv7pKrKM-3Mv1QpH7VzZRGzDLfm-gf4Q2\" /\u003e\r\n\r\n\u003cdiv class=\"inner-01\"\u003e\r\n\u003cform class=\"form form-01 try-001\" id=\"analysisForm\"\u003e\r\n    Select a Market from Your Watchlist:\r\n    \u003cdiv class=\"type\"\u003e\r\n        \u003cselect id=\"WatchlistItem\" name=\"WatchlistItem\"\u003e\u003coption value=\"\"\u003eSelect Market\u003c/option\u003e\r\n\u003coption selected=\"selected\" value=\"In Order\"\u003eShow All - In Order\u003c/option\u003e\r\n\u003coption value=\"A-Z\"\u003eShow All - Alphabetical A-Z\u003c/option\u003e\r\n\u003coption value=\"Z-A\"\u003eShow All - Alphabetical Z-A\u003c/option\u003e\r\n\u003coption value=\"5653923ac7eb6e355878bfe6\"\u003eUS - S\u0026amp;P 500 Index\u003c/option\u003e\r\n\u003coption value=\"5a2b420decfdc711085dc51d\"\u003eBitcoin Per USD\u003c/option\u003e\r\n\u003coption value=\"5653923ac7eb6e355878bfeb\"\u003eUS - Dow Jones Industrials Index\u003c/option\u003e"}['Html'])

soup.select('option:-soup-contains("US - Dow Jones Industrials Index")')[0].get('value')
输出
5653923ac7eb6e355878bfeb