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
。 问题可能需要一些改进,因为它不能完全重现
主要问题:
- 你的例子尝试像字符串
一样对字典/JSON进行操作
- 你的选择
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
我想获得所有选项 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
。 问题可能需要一些改进,因为它不能完全重现
主要问题:
- 你的例子尝试像字符串 一样对字典/JSON进行操作
- 你的选择
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