代码之家  ›  专栏  ›  技术社区  ›  Funkeh-Monkeh

将多个DIV类中的数据刮到PANDAS数据帧中

  •  2
  • Funkeh-Monkeh  · 技术社区  · 6 年前

    我正在从仪表板上抓取一些数据,并一直试图在多个仪表板中获取一些数据 div classes 进入熊猫数据帧。我应该如何尝试转换如下内容:

    [<div class="map-item" data-companyname="Apical Group" data-country="INDONESIA" data-district="Jakarta Utara" data-latitude="-6.099396000" data-longitude="106.951478000" data-millname="AAJ Marunda" data-province="Jakarta" data-report="http://naturalhealthytreat.com/sites/neste-daemeter.com/files/AAJ_Marunda.pdf" id="map_item_4645">AAJ Marunda</div>,
     <div class="map-item" data-companyname="Apical Group" data-country="INDONESIA" data-district="Lubuk Gaung" data-latitude="1.754005000" data-longitude="101.363532000" data-millname="Sari Dumai Sejati" data-province="Riau" data-report="http://naturalhealthytreat.com/sites/neste-daemeter.com/files/Sari_Dumai_Sejati.pdf" id="map_item_4646">Sari Dumai Sejati</div>,
     <div class="map-item" data-companyname="Kutai Refinery Nusantara " data-country="INDONESIA" data-district="Balikpapan" data-latitude="-1.179099000" data-longitude="116.788274000" data-millname="Kutai Refinery Nusantara " data-province="Penajam Paser Utara" data-report="http://naturalhealthytreat.com/sites/neste-daemeter.com/files/Kutai_Refinery_Nusantara_.pdf" id="map_item_4647">Kutai Refinery Nusantara </div>]
    

    在这样的数据框中:

    no  companyname country district    latitude    longitude   millname    province    report
    1   Apical Group    INDONESIA   Jakarta Utara   -6.099396   106.951478  AAJ Marunda Jakarta http://naturalhealthytreat.com/sites/neste-daemeter.com/files/AAJ_Marunda.pdf
    2   Apical Group    INDONESIA   Lubuk Gaung 1.754005    101.363532  Sari Dumai Sejati   Riau    http://naturalhealthytreat.com/sites/neste-daemeter.com/files/Kutai_Refinery_Nusantara_.pdf
    3   Kutai Refinery Nusantara    INDONESIA   Balikpapan  -1.179099   116.788274  Kutai Refinery Nusantara    Penajam Paser Utara http://naturalhealthytreat.com/sites/neste-daemeter.com/files/Kutai_Refinery_Nusantara_.pdf
    

    到目前为止,这是我为从网页获取多个DIV类而编写的代码:

    from bs4 import BeautifulSoup
    import requests
    
    # Link of Neste dashboard
    url = 'http://nestetraceabilitydashboard.com/nestes-pfad-traceability-dashboard' 
    page = requests.get(url).content
    soup = BeautifulSoup(page, "html.parser")
    
    divList = soup.findAll('div', attrs={ "class" : "map-item"})
    
    1 回复  |  直到 6 年前
        1
  •  4
  •   Keyur Potdar    6 年前

    我们可以使用 .attrs 属性。因此,我们可以创建一个包含所有标记属性(类和ID除外)的字典,并将其传递给一个数据帧。

    from bs4 import BeautifulSoup
    import requests
    import pandas as pd
    
    url = 'http://nestetraceabilitydashboard.com/nestes-pfad-traceability-dashboard' 
    page = requests.get(url).text
    soup = BeautifulSoup(page, "html.parser")
    
    divList = soup.findAll('div', attrs={"class" : "map-item"})
    data = {}
    for div in divList:
        for k,v in div.attrs.items(): 
            if k not in ('class', 'id'):
                k = k.split('-')[1]
                data[k] = data.get(k, []) + [v]
    
    df = pd.DataFrame(data)
    print(df.head(3))
    

    数据帧:

                     companyname    country       district      latitude  \
    0               Apical Group  INDONESIA  Jakarta Utara  -6.099396000
    1               Apical Group  INDONESIA    Lubuk Gaung   1.754005000
    2  Kutai Refinery Nusantara   INDONESIA     Balikpapan  -1.179099000
    
           longitude                   millname             province  \
    0  106.951478000                AAJ Marunda              Jakarta
    1  101.363532000          Sari Dumai Sejati                 Riau
    2  116.788274000  Kutai Refinery Nusantara   Penajam Paser Utara
    
                                                  report
    0  http://naturalhealthytreat.com/sites/neste-dae...
    1  http://naturalhealthytreat.com/sites/neste-dae...
    2  http://naturalhealthytreat.com/sites/neste-dae...
    

    关于 requests

    最好用一下 .text 而不是 .content ,因为它保存解码的响应内容(文本)。所以总是使用 文本 ,除非响应A是二进制文件(图像、PDF等)。

    关于 BeautifulSoup

    findAll 用于向后兼容 bs3 bs4 它被重命名为 find_all . 此外,还可以使用属性作为 keyword arguments ,例如:

    find_all('div', class_="map-item")
    

    这里我用过 class_ 因为 class 是一个python关键字,但是对于其他属性(id、href等),您可以使用它们的名称。