簡體   English   中英

AsyncHTMLSession 返回無序的響應列表? 如何排序或使列表有序?

[英]AsyncHTMLSession returns responses list disorderly! How to sort or make list ordered?

我發現 async requests-html 比使用 BeautifulSoup 進行解析的簡單請求有用得多。但是當我使用 function asession.run 作為我的異步函數時,結果以無序的方式返回響應,如果我為async function 給我的回應是 url 作為對其進行排序的關鍵,但在我看來它看起來是多余的。 有任何想法嗎?

在這里,我期待正確的響應順序,至少在每個新的 function 調用中它不是隨機的:

from requests_html import AsyncHTMLSession, HTMLSession, HTMLResponse
from bs4 import BeautifulSoup

asession = AsyncHTMLSession()

async def kucoin():
    print(f'get K')
    r = await asession.get('https://kucoin.com')
    return r

async def gateio():
    print(f'get g')
    r = await asession.get('https://gate.io')
    return r

async def vk():
    print(f'get vk')
    r = await asession.get('https://vk.com')
    return r


tasks = [kucoin, gateio, vk]
results = asession.run(*tasks)
for result in results:
    print(BeautifulSoup(result.text).title)`

但是得到:

get K
get g
get vk
<title>Buy/Sell Bitcoin, Ethereum | Cryptocurrency Exchange | Gate.io</title>
<title>Crypto Exchange | Bitcoin Exchange | Bitcoin Trading | KuCoin</title>
<title>Welcome | VK</title>

如果您有異步解析方面的經驗,請與我分享您的經驗,我將不勝感激!

更新:發現在這個庫中返回無序響應是正常的https://github.com/psf/requests-html/issues/381

AsyncHTMLSession.run中, done是一個set (無序)。

您可以替換實現以從tasks返回結果:

def run(self, *coros):
    tasks = [asyncio.ensure_future(coro()) for coro in coros]
    done, _ = self.loop.run_until_complete(asyncio.wait(tasks))
    # return [t.result() for t in done]
    return [t.result() for t in tasks]

AsyncHTMLSession.run = run

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM