我想在單個 DataFrame 上從每個公司抓取此網頁的所有不同表中獲取:
https://rk.americaeconomia.com/display/embed/500-latam/2021
或者
https://www.americaeconomia.com/negocios-industrias/estas-son-las-500-mayores-empresas-de-america-latina-2021
找到解決方案非常困難。
uj5u.com熱心網友回復:
情況
有兩種不同的型別,<tr>一種帶有資料,另一種帶有額外資料,對應于第一種,我們必須將它們組合在一起。還有一點是額外的資料沒有存盤在普通的表結構中
如何實作?
資料和額外資料的每個組合都必須連接到一行 - 有很多選項可以這樣做,這種方法處理資料幀。加入的資料幀存盤在一個串列中,并在迭代完成后連接起來。
data = []
for row in soup.select('#awesomeTable tbody tr.extraDataRow'):
df = pd.DataFrame([list(row.find_previous('tr').stripped_strings)], columns=list(soup.select_one('#awesomeTable tr').stripped_strings))
df = df.join(pd.DataFrame(dict([list(x.stripped_strings) for x in row.select('p')]), index=df.index))
data.append(df)
df = pd.concat(data)
例子
import requests
import pandas as pd
from bs4 import BeautifulSoup
headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36'}
r = requests.get('https://rk.americaeconomia.com/display/embed/500-latam/2021',headers=headers)
soup = BeautifulSoup(r.text,'lxml')
data = []
for row in soup.select('#awesomeTable tbody tr.extraDataRow'):
df = pd.DataFrame([list(row.find_previous('tr').stripped_strings)], columns=list(soup.select_one('#awesomeTable tr').stripped_strings))
df = df.join(pd.DataFrame(dict([list(x.stripped_strings) for x in row.select('p')]), index=df.index))
data.append(df)
df = pd.concat(data)
輸出
| RK 2021 | EMPRESA | 派斯 | RK 2020* | RK 2019 | 部門 / RUBRO | VENTAS 2020 US$ Millones | VENTAS 2019 US$ Millones | VARIACIóN VENTAS 20/19 (%) | UTILIDAD NETA 2020 美元 | UTILIDAD NETA 2019 美元 | VARIACIóN UTILIDAD 20/19 (%) | EBITDA 2020 美元 | EBITDA 2019 美元 | VARIACIóN EBITDA 20/19 (%) | ACTIVO TOTAL 2020 US$ Millones | PATRIMONIO NETO 2020 美元 | 2020 年員工 | EMPLEADOS 2019 | 資產回報率 (%) 2020 | ROE (%) 2020 | MARGEN NETO (%) 2020 | Presencia EN BOLSA | SITIO 網站 (www.) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 巴西石油公司 | 胸罩 | 1 | 1 | 石油/天然氣 | 53,282.0 | 76,746.8 | -30.6 | 1,392.0 | 10,191.7 | -86.3 | 21,777.0 | 35,461.8 | -38.6 | 190,107.6 | 59,905.7 | ND | 58,513 | 0.7 | 2.3 | 2.6 | 西 | 巴西石油公司 |
| 2 | JBS | 胸罩 | 4 | 4 | 食品 | 52,916.8 | 51,933.1 | 1.9 | 900.5 | 1,540.9 | -41.6 | 5,539.7 | 5,018.0 | 10.4 | 31,536.7 | 8,383.6 | ND | 234,192 | 2.9 | 10.7 | 1.7 | 西 | jbs.com.br |
| 3 | 美國 MóVIL | MX | 3 | 3 | 電信 | 51,352.7 | 53,288.7 | -3.6 | 2,366.0 | 3,582.9 | -34 | 16,644.7 | 16,597.6 | 0.3 | 82,064.9 | 15,913.4 | 186,851 | 191,523 | 2.9 | 14.9 | 4.6 | 西 | americamovil.com |
| 4 | 墨西哥石油公司 | MX | 2 | 2 | 石油/天然氣 | 44,676.3 | 72,837.4 | -38.7 | -22,520.7 | -18,042.9 | 24.8 | 4,779.8 | 9,465.4 | -49.5 | 95,527.7 | -122,327.0 | ND | 156,614 | -23.6 | 18.4 | -50.4 | 不 | pemex.com |
| 5 | 谷 | 胸罩 | 5 | 5 | 礦業公司 | 40,838.3 | 37,743.0 | 8.2 | 5,231.4 | -1,694.0 | -408.8 | 14,527.9 | 4,995.8 | 190.8 | 92,054.2 | 34,845.2 | ND | 71,149 | 5.7 | 15 | 12.8 | 西 | 淡水河谷 |
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/407907.html
標籤:
