【问题标题】:How to collect "td" text from list of lists and add them into the dictionary python beautifulSoup如何从列表中收集“td”文本并将它们添加到字典中
【发布时间】:2022-01-09 03:03:58
【问题描述】:

在这里,我试图获取图片中显示的表格中每一列的值(对于三个不同的页面)并将它们存储在 pandas 数据框中。我已经收集了数据,现在我有一个列表列表,但是当我尝试将它们添加到字典时,我得到空字典。谁能帮助我我做错了什么或建议另一种方法来创建 3 个数据框,每个表一个?

这是我的代码:

import numpy as np
import pandas as pd
from datetime import datetime
import pytz
import requests
import json
from bs4 import BeautifulSoup

url_list = ['https://www.coingecko.com/en/coins/ethereum/historical_data/usd?start_date=2021-08-06&end_date=2021-09-05#panel',
            'https://www.coingecko.com/en/coins/cardano/historical_data/usd?start_date=2021-08-06&end_date=2021-09-05#panel',
           'https://www.coingecko.com/en/coins/chainlink/historical_data/usd?start_date=2021-08-06&end_date=2021-09-05#panel']
   
results = []


for url in url_list:
    response = requests.get(url)
    src = response.content
    soup = BeautifulSoup(response.text , 'html.parser')
    results.append(soup.find_all( "td",class_= "text-center"))
    
collected_data = dict()    

for result in results:
    for r in result:
        datas = r.find_all("td", title=True)

    for data in datas:
        collected_data.setdefault(data.text)
        
collected_data

【问题讨论】:

    标签: python pandas dataframe dictionary beautifulsoup


    【解决方案1】:

    会发生什么?

    在您的第一个for loop 中,您只需将soup.find_all( "td",class_= "text-center") 的结果集附加到results

    所以你不会用datas = r.find_all("td", title=True)找到你要找的东西

    还要注意,列标题不是放在<td> 中,而是放在<th> 中。

    如何解决?

    您可以选择更具体的,<tbody> 中的所有 <tr> 进行迭代:

    for row in soup.select('tbody tr'):
    

    在迭代时选择 <th><td>zip()dict() 并带有列标题列表:

                data.append(
                    dict(zip([x.text for x in soup.select('thead th')], [x.text.strip() for x in row.select('th,td')]))
                )
    

    示例

    import pandas as pd
    import requests
    from bs4 import BeautifulSoup
    
    url_list = ['https://www.coingecko.com/en/coins/ethereum/historical_data/usd?start_date=2021-08-06&end_date=2021-09-05#panel',
                'https://www.coingecko.com/en/coins/cardano/historical_data/usd?start_date=2021-08-06&end_date=2021-09-05#panel',
               'https://www.coingecko.com/en/coins/chainlink/historical_data/usd?start_date=2021-08-06&end_date=2021-09-05#panel']
    
    data = []
    
    for url in url_list:
        response = requests.get(url)
        src = response.content
        soup = BeautifulSoup(response.text , 'html.parser')
        
        for row in soup.select('tbody tr'):
            
            data.append(
                dict(zip([x.text for x in soup.select('thead th')], [x.text.strip() for x in row.select('th,td')]))
            )
            
    pd.DataFrame(data)
    

    输出

    Date Market Cap Volume Open Close
    2021-09-05 $456,929,768,632 $24,002,848,309 $3,894.94 N/A
    2021-09-04 $462,019,852,288 $30,463,347,266 $3,936.16 $3,894.94
    2021-09-03 $444,936,758,975 $28,115,776,510 $3,793.30 $3,936.16

    编辑

    要为每个 url 获取一个数据帧,您可以将代码更改为以下 - 它将帧附加到列表中,以便您可以迭代执行操作。

    注意 这是基于您的评论,如果合适,可以。我建议将硬币提供者也存储为列,这样您就可以对所有提供者进行过滤、分组、...-但这应该在一个新问题中提出,如果重要的话。

    dfList = []
    
    for url in url_list:
        response = requests.get(url)
        src = response.content
        soup = BeautifulSoup(response.text , 'html.parser')
        
        data = []
        coin = url.split("/")[5].upper()
        for row in soup.select('tbody tr'):
            
            data.append(
                dict(zip([f'{x.text}_{coin}' for x in soup.select('thead th')], [x.text.strip() for x in row.select('th,td')]))
            )
        # if you like to save directly as csv... change next line to -> pd.DataFrame(data).to_csv(f'{coin}.csv')
        dfList.append(pd.DataFrame(data))
    

    输出

    通过列表索引选择数据框,例如dfList[0]

    Date_ETHEREUM Market Cap_ETHEREUM Volume_ETHEREUM Open_ETHEREUM Close_ETHEREUM
    2021-09-05 $456,929,768,632 $24,002,848,309 $3,894.94 N/A
    2021-09-04 $462,019,852,288 $30,463,347,266 $3,936.16 $3,894.94

    【讨论】:

    • 感谢您的回答,这非常完美,但我希望创建 3 个表格,其列格式为“Market Cap_CURRENCYX”、“Volume_CURRENCYX”、“Open_CURRENCYX”、“Close_CURRENCYX”、“Market Cap_CURRENCYX” , 'Volume_CURRENCYY', 'Open_CURRENCYY', 'Close_CURRENCYY', ... 对于每个。
    • 你也能指导我吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多