Мы можем получить доступ к атрибутам тега с атрибутом .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 и т. д.), вы можете использовать их имя как есть.