繁体   English   中英

如何使用 Python 从 HTTP 响应中提取数据?

[英]How extract data from HTTP response with Python?

我正在尝试使用 yahoo 的自动补全功能,我找到了要执行此操作的链接。 为此,我在 python 中使用请求,我给出了正确的 URL 并且在执行“.get”之后我得到了回复。 我不明白响应是哪种数据。 是data,array,JSON是什么,怎么理解python里面的数据是什么? 如何从这个复杂的数组中推断出单个数据? 例如,我需要在标签之后提取数据:“exchange”:“MIL”,我需要获取 MIL “shortname”:“MEDIOBANCA”,我需要 Mediobanca 怎么可能做到这一点?

r = requests.get(apiurl)
body=r.text

回复:

 {"explains":[],"count":6,"quotes":[{"exchange":"MIL","shortname":"MEDIOBANCA","quoteType":"EQUITY","symbol":"MB.MI","index":"quotes","score":20129.0,"typeDisp":"Equity","longname":"Mediobanca Banca di Credito Finanziario S.p.A.","isYahooFinance":true},{"exchange":"PNK","shortname":"MEDIOBANCA DI CREDITO FINANZ SP","quoteType":"EQUITY","symbol":"MDIBY","index":"quotes","score":20020.0,"typeDisp":"Equity","longname":"Mediobanca Banca di Credito Finanziario S.p.A.","isYahooFinance":true},{"exchange":"FRA","shortname":"MEDIOBCA  EO 0,50","quoteType":"EQUITY","symbol":"ME9.F","index":"quotes","score":20011.0,"typeDisp":"Equity","longname":"Mediobanca Banca di Credito Finanziario S.p.A.","isYahooFinance":true},{"exchange":"VIE","shortname":"MEDIOBANCA SPA","quoteType":"EQUITY","symbol":"MB.VI","index":"quotes","score":20001.0,"typeDisp":"Equity","longname":"Mediobanca Banca di Credito Finanziario S.p.A.","isYahooFinance":true},{"exchange":"IOB","shortname":"MEDIOBANCA BANCA DI CREDITO FIN","quoteType":"EQUITY","symbol":"0HBF.IL","index":"quotes","score":20001.0,"typeDisp":"Equity","isYahooFinance":true},{"exchange":"STU","shortname":"MEDIOBANCA - BCA CRED.FIN. SPAA","quoteType":"EQUITY","symbol":"ME9.SG","index":"quotes","score":20001.0,"typeDisp":"Equity","isYahooFinance":true}],"news":[],"nav":[],"lists":[],"researchReports":[],"totalTime":19,"timeTakenForQuotes":411,"timeTakenForNews":700,"timeTakenForAlgowatchlist":400,"timeTakenForPredefinedScreener":400,"timeTakenForCrunchbase":0,"timeTakenForNav":400,"timeTakenForResearchReports":0}

更新:

    list_a = ["mediob"]
list_b = [" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "l", "m", "n", "o", "p", "q", "r", "s", "t", "v", "z",
           "ü", "ä", "ö", "y", "w", "x"] 
list_c = [f"{i} {j}" for i in list_a for j in list_b]
               
for x in list_c:
    apiurl = "https://query1.finance.yahoo.com/v1/finance/search?q="+x+"&quotesCount=6&quotesQueryId=tss_match_phrase_query&multiQuoteQueryId=multi_quote_single_token_query&enableNavLinks=true&enableEnhancedTrivialQuery=true" 
    r = requests.get(apiurl)
    data = r.json()
    shortname = data["quotes"][0]["shortname"]
    print(shortname)

它给出了 IndexError: list index out of range

好吧,首先你的网址不正确。 这里应该没有空格f"{i} {j}" for i in list_a for j in list_b 您只有一个 URL。 它应该是[f"{i}{j}" for i in list_a for j in list_b] 。现在,生成的 url 会有所不同,我们可以成功抓取数据..例如

list_c = [f"{i}{j}" for i in list_a for j in list_b]

for x in list_c:
    apiurl = "https://query1.finance.yahoo.com/v1/finance/search?q="+x+"&quotesCount=6&quotesQueryId=tss_match_phrase_query&multiQuoteQueryId=multi_quote_single_token_query&enableNavLinks=true&enableEnhancedTrivialQuery=true"
    r = requests.get(apiurl)
    data = r.json()
    if data["quotes"]:
        shortname = data["quotes"][0]["score"]
        print(shortname)

Output:-

20139.0
20139.0
20011.0
20139.0
20139.0
20139.0

或者对于 Shortname:- shortname = data["quotes"][0]["shortname"]

MEDIOBANCA
MEDIOBANCA
MEDIOBCA  EO 0,50
MEDIOBANCA
MEDIOBANCA
MEDIOBANCA
 import requests

list_a = ["mediob"]
list_b = [" ", "a", "b", "c", "d", "e", "f", "g", "h", "i", "l", "m", "n", "o", "p", "q", "r", "s", "t", "v", "z",
           "ü", "ä", "ö", "y", "w", "x"] 
list_c = [f"{i} {j}" for i in list_a for j in list_b]
for x in list_c:
    apiurl = "https://query1.finance.yahoo.com/v1/finance/search?q="+x+"&quotesCount=6&quotesQueryId=tss_match_phrase_query&multiQuoteQueryId=multi_quote_single_token_query&enableNavLinks=true&enableEnhancedTrivialQuery=true" 
    r = requests.get(apiurl)
    data = r.json()
    if data['quotes']:
        print(data["quotes"][0]["shortname"])

我采用了您提供的示例响应并创建了一个模拟 api 来模拟您在做什么。 您得到的响应基本上是 json 响应。

我还看到您已经尝试了上述方法并且遇到了错误。 原因是当某些列表为空时,您需要在尝试打印print(data["quotes"][0]["shortname"])之前确保列表不为空,因此我们有 if 语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM