【问题标题】:How can I use BeautifulSoup to scrape this table?我怎样才能使用 BeautifulSoup 来刮这张桌子?
【发布时间】:2022-01-20 22:08:27
【问题描述】:

我是 Python 和学习数据分析的新手。我正在尝试从这个网页上抓取数据:https://bitinfocharts.com/dogecoin/address/DN5Hp2kCkvCsdwr5SPmwHpiJgjKnC5wcT7

我可以使用简单的网站抓取数据,但我认为由于 BitInfoCharts 有表格,因此它可能是一个比我所关注的教程更复杂的 HTML 设置。

我的目标是从表格中抓取数据,包括区块、时间、金额、余额等,并将其保存在 csv 文件中。我之前尝试过使用 pandas,但发现很难从 HTML 中选择我想要的数据。

为此,我认为我需要做的是从“class="table abtb tablesorter tablesorter-default" 中获取表头/表信息,然后从包含该类的每个对象中提取所有信息"class="trb"。 class=trb 因页面而异(例如,一个人可能有 7 笔交易,而另一个人可能有 40 笔)。不过我不太确定,因为这对我来说是新领域。

非常感谢任何帮助。

import requests
from bs4 import BeautifulSoup as bs 
url = 'https://bitinfocharts.com/dogecoin/address/DN5Hp2kCkvCsdwr5SPmwHpiJgjKnC5wcT7'
headers = {"User-Agent":"Mozilla/5.0"}

r = requests.get(url, headers=headers)

soup = bs(r.content)

table = soup.find_all("table_maina")
print(table)

【问题讨论】:

    标签: python web-scraping beautifulsoup


    【解决方案1】:

    如果您决定手动执行此操作,则执行相同的操作:

    import csv
    import requests
    from bs4 import BeautifulSoup as bs 
    url = 'https://bitinfocharts.com/dogecoin/address/DN5Hp2kCkvCsdwr5SPmwHpiJgjKnC5wcT7'
    headers = {"User-Agent":"Mozilla/5.0"}
    
    r = requests.get(url, headers=headers)
    
    soup = bs(r.content,'lxml')
    table = soup.find(id="table_maina")
    headers = []
    datarows = []
    for row in table.find_all('tr'):
        heads = row.find_all('th')
        if heads:
            headers = [th.text for th in heads]
        else:
            datarows.append( [td.text for td in row.find_all('td')] )
            
    fcsv = csv.writer( open('x.csv','w',newline=''))
    fcsv.writerow(headers)
    fcsv.writerows(datarows)
    

    【讨论】:

    • 嘿,成功了!太感谢了。我将在多个地址上运行此脚本,因此将 .csv 文件命名为加密地址将有助于组织。是否可以使 CSV 文件名成为加密地址的变量?我之前尝试过将变量分配给加密地址,然后将该变量作为 .csv 文件名添加到 write.csv 中,但它会出错。
    • 只是一个字符串。只要您可以构造一个正确的文件名字符串,您就可以将它传递给open。 URL 不是正确的文件名。
    【解决方案2】:

    只有一个名为“table_maina”的表格元素,因此您应该调用 find() 与 find_all()。此外,您需要将“table”标签指定为 find() 函数中的第一个参数。

    试试:

    table = soup.find('table', id='table_maina')
    for tr in table.find_all('tr', class_='trb'):
      print(tr.text)
    

    输出:

    4066317 2022-01-17 15:41:22 UTC2022-01-17 15:41:22 UTC-33,000,000 DOGE (5,524,731.65 USD)220,000,005.04121223 DOGE$36,831,545 @ $0.167$-28,974,248
    4063353 2022-01-15 11:04:46 UTC2022-01-15 11:04:46 UTC+4,000,000 DOGE (759,634.87 USD)253,000,005.04121223 DOGE$48,046,907 @ $0.19$-23,283,618
    ...
    

    接下来,要将每一行输出到 CSV 文件中,然后试试这个:

    import csv
    import requests
    from bs4 import BeautifulSoup
    
    url = 'https://bitinfocharts.com/dogecoin/address/DN5Hp2kCkvCsdwr5SPmwHpiJgjKnC5wcT7'
    headers = {"User-Agent": "Mozilla/5.0"}
    
    r = requests.get(url, headers=headers, verify=False)
    soup = BeautifulSoup(r.content, "html.parser")
    
    table = soup.find("table", id='table_maina')
    with open('out.csv', 'w', newline='') as fout:
        csv_writer = csv.writer(fout)
        csv_writer.writerow(['Block', 'Time', 'Amount', 'Balance', 'Price', 'Profit'])
        for tr in table.find_all('tr', class_='trb'):
            tds = tr.find_all('td')
            csv_writer.writerow([x.text for x in tds])
    

    输出:

    Block,Time,Amount,Balance,Price,Profit
    4066317 2022-01-17 15:41:22 UTC,2022-01-17 15:41:22 UTC,"-33,000,000 DOGE (5,524,731.65 USD)","220,000,005.04121223 DOGE","$36,831,545 @ $0.167","$-28,974,248"
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2021-07-01
      • 1970-01-01
      • 2011-04-07
      • 2021-10-10
      • 2010-11-21
      • 2018-08-29
      相关资源
      最近更新 更多