Mengekstrak data tabel dari web menggunakan python
Saya perlu mengekstrak tabel dari situs web "https://geniusimpex.org/pakistan-import-data/" yang memiliki ribuan baris, jadi saya ingin mengotomatiskan proses menggunakan bs4 dan selenium tetapi ketika saya mengekstrak tabel hanya header tabel diekstraksi. Ini adalah kode yang saya gunakan
from bs4 import BeautifulSoup
from urllib.request import urlopen
url = "https://geniusimpex.org/pakistan-import-data/"
html = urlopen(url)
soup = BeautifulSoup(html, 'lxml')
type(soup)
soup.prettify()
print(soup.find_all('tr'))
Ini menunjukkan output berikut
[1]:https://i.stack.imgur.com/GItzv.png
Seperti yang Anda lihat, hanya baris pertama yang diekstraksi. Dapatkah seseorang memberi tahu saya mengapa saya tidak dapat mengekstrak tabel dan bagaimana saya bisa melakukannya? Ini akan sangat membantu. Maaf jika saya tidak jelas atau tidak bisa menjelaskan masalah saya. Ini adalah pertama kalinya saya mengajukan pertanyaan tentang stack overflow.
Jawaban
Data diambil dari URL eksternal sebagai Json. Anda dapat menggunakan skrip ini untuk memuat informasi:
import json
import requests
url = 'https://geniusimpex.org/wp-admin/admin-ajax.php?action=ge_forecast_list_data&order=asc&offset={offset}&limit=1000'
offset = 0
while True:
data = requests.get(url.format(offset=offset)).json()
# print data to screen:
for row in data.get('rows', []):
for k, v in row.items():
print('{:<30} {}'.format(k, v))
print('-' * 80)
if len(data.get('rows', [])) != 1000:
break
offset += 1000
Cetakan:
...
--------------------------------------------------------------------------------
count T
importer_name <span file_id="27893" post_count="T" post_id="2157293">BISMILLAH STEEL FURNACE \n NEAR GRID STATION DEEWAN</span>
goods_description IRON AND STEEL REMELTABLE SCRAP HARMONIZED CODE: 7204.4990 REFERENCE NUMBER:UM/PAK/5146A ITN: X20200629019843 NWT WEIGHT-19.650 MT SHIPPERS LOAD, STOWAGE AND COUNT
hs_code
shipment_port NEWARK APT/NEW
gross_weight 19.65
number_of_packages 1
unit_of_packages PACKAGES
size_of_container 1 X 20FT
imported_from_name SEALINK INTERNATIONAL INC C/O\n UNIVERSAL METALS, ,
bill_of_lading_number SII145321
bill_of_lading_date <span data="10-08-2020">10-08-2020</span>
--------------------------------------------------------------------------------
count T
importer_name <span file_id="27938" post_count="T" post_id="2159597">ASAD SHAHZAD S/O FAQIR ZADA</span>
goods_description 1 USED VEHICLE TOYOTA VITZ CHASSIS NO: KSP130 -2204837
hs_code NA
shipment_port NAGOYA, AICHI
gross_weight .97
number_of_packages 1
unit_of_packages UNIT
size_of_container 1 X 40FT
imported_from_name KASHMIR MOTORS , 3055-9-104 KUZUTSUKA NIIGATA KITA
bill_of_lading_number TA200716H06- 10
bill_of_lading_date <span data="10-08-2020">10-08-2020</span>
--------------------------------------------------------------------------------
...
EDIT: Untuk menyimpan ke CSV, Anda dapat menggunakan skrip ini:
import json
import requests
import pandas as pd
url = 'https://geniusimpex.org/wp-admin/admin-ajax.php?action=ge_forecast_list_data&order=asc&offset={offset}&limit=1000'
offset = 0
all_data = []
while True:
data = requests.get(url.format(offset=offset)).json()
# print data to screen:
for row in data.get('rows', []):
all_data.append(row)
for k, v in row.items():
print('{:<30} {}'.format(k, v))
print('-' * 80)
if len(data.get('rows', [])) != 1000:
break
offset += 1000
df = pd.DataFrame(all_data)
df.to_csv('data.csv')
Menghasilkan:
