【发布时间】:2019-12-19 08:32:51
【问题描述】:
我在磁盘上有大约 40 000 个 HTML 文件,并使用 Beautiful Soup 解析 HTML 并返回每个 HTML 的字典。 在读取/解析期间,我将所有字典附加到列表中,并在最后创建 pandas DataFrame。
在同步模式下一切正常,但运行需要很长时间,所以我想用aiofiles 运行
目前我的代码如下所示:
# Function for fetching all ad info from single page
async def getFullAdSoup(soup):
...
adFullFInfo = {} # dictionary parsed from Beautifoul soup object
return await adFullFInfo
async def main():
adExtendedDF = pd.DataFrame()
adExtendednfo = {}
htmls = glob.glob("HTML_directory" + "/*.html") # Get all HTML files from directory
htmlTasks = [] # Holds list of returned dictionaries
for html in natsorted(htmls):
async with aiofiles.open(html, mode='r', encoding='UTF-8', errors='strict', buffering=1) as f:
contents = await f.read()
htmlTasks.append(getFullAdSoup(BeautifulSoup(contents, features="lxml")))
htmlDicts = await asyncio.gather(*htmlTasks)
adExtendedDF = pd.DataFrame(data=htmlDicts, ignore_index=True)
if __name__ == '__main__':
loop = asyncio.get_event_loop()
loop.run_until_complete(main())
我得到的错误是:
文件“C:/Users/.../test.py”,第 208 行,在 getFullAdSoup 中 return await adFullFInfo TypeError: object dict can't be used in 'await' expression
我发现了类似的问题here,但我无法解决。 我不知道如何将解析函数转换为异步模式以及如何迭代调用该函数的文件。
【问题讨论】:
-
你的错误显然是因为 await
adFullFInfo这是一个字典,为什么会这样? -
asyncio 也适用于繁重的 IO 和 Web 请求,读取和处理多个文件最好使用多处理
-
我知道。想法是将其转换为可在 asyncio 中使用的东西。
标签: python pandas asynchronous python-asyncio python-aiofiles