Ответ на http://finra-markets.morningstar.com/BondCenter/Results.jsp
не содержит результатов поиска. Он должен извлекать данные асинхронно.
Простой способ узнать, какие сетевые запросы вернули результаты поиска, - это поиск запросов по одному из результатов поиска с использованием Firefox Dev Tools. :
![The search button](https://i.stack.imgur.com/YCXKV.png)
![Searching the requests](https://i.stack.imgur.com/Cet97.png)
Для преобразования HTTP-запроса в Python запрос, я копирую запрос как метод кода CURL из Firefox, импортирую его в Postman и затем экспортирую как код Python (немного длинно (и лениво), я знаю!):
![Import button in Postman](https://i.stack.imgur.com/bnfSH.png)
![Import CURL request in Postman](https://i.stack.imgur.com/kbJqR.png)
![The 'code' button in Postman](https://i.stack.imgur.com/9tWIM.png)
![The dropdown to select the code language in Postman](https://i.stack.imgur.com/be3OL.png)
Все это приводит к следующему коду:
import requests
url = "http://finra-markets.morningstar.com/bondSearch.jsp"
payload = "count=20&searchtype=B&query=%7B%22Keywords%22%3A%5B%7B%22Name%22%3A%22debtOrAssetClass%22%2C%22Value%22%3A%223%2C6%22%7D%2C%7B%22Name%22%3A%22showResultsAs%22%2C%22Value%22%3A%22B%22%7D%5D%7D&sortfield=issuerName&sorttype=1&start=0&curPage=1"
headers = {
'User-Agent': "...",
'Accept': "text/plain, */*; q=0.01",
'Accept-Language': "en-US,en;q=0.5",
'Content-Type': "application/x-www-form-urlencoded; charset=UTF-8",
'X-Requested-With': "XMLHttpRequest",
'Origin': "http://finra-markets.morningstar.com",
'DNT': "1",
'Connection': "keep-alive",
'Referer': "http://finra-markets.morningstar.com/BondCenter/Results.jsp",
'Cookie': "...",
'cache-control': "no-cache"
}
response = requests.request("POST", url, data=payload, headers=headers)
print(response.text)
Ответ не был 100% JSON. Так что я просто убрал внешний пробел и {B:..}
часть:
>>> text = response.text.strip()[3:-1]
>>> import json
>>> data = json.loads(text)
>>> data['Columns'][0]
{'moodyRating': {'ratingText': '', 'ratingNumber': 0},
'fitchRating': {'ratingText': None, 'ratingNumber': None},
'standardAndPoorRating': {'ratingText': '', 'ratingNumber': 0},