Скопирование данных из нескольких классов div в кадр данных pandas - PullRequest
0 голосов
/ 22 мая 2018

Я собираю некоторые данные с панели управления и пытаюсь получить данные из нескольких div classes во фрейм данных pandas.Как мне попытаться преобразовать что-то вроде этого:

[<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 Ответ

0 голосов
/ 22 мая 2018

Мы можем получить доступ к атрибутам тега с атрибутом .attrs.Таким образом, мы можем создать словарь со всеми атрибутами тега (кроме class и 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, потому что он содержит декодированное содержимое ответа (текст).Поэтому всегда используйте .text, если ответ a не является двоичным файлом (изображение, pdf и т. Д.).

О BeautifulSoup

findAll используется для обратной совместимости с bs3, в bs4 он переименован в find_all.Кроме того, вы можете использовать атрибуты в качестве аргументов ключевых слов , например:

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

Здесь я использовал class_ для атрибута класса, потому что class является ключевым словом Python, но для другихатрибуты (id, href и т. д.), вы можете использовать их имя как есть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...