अजगर का उपयोग करके वेब से तालिका डेटा निकालना
मुझे एक वेबसाइट "https://geniusimpex.org/pakistan-import-data/" से एक तालिका निकालने की जरूरत है, जिसमें हजारों पंक्तियां हैं, इसलिए मैं bs4 और सेलेनियम का उपयोग करके प्रक्रिया को स्वचालित करना चाहता था, लेकिन जब मैं केवल तालिका निकालता हूं तालिका शीर्षलेख निकाला जाता है। यह वह कोड है जिसका मैंने उपयोग किया था
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'))
यह निम्न आउटपुट दिखाता है
[1]:https://i.stack.imgur.com/GItzv.png
जैसा कि आप देख सकते हैं केवल पहली पंक्ति निकाली गई है। क्या कोई मुझे बता सकता है कि मैं टेबल क्यों नहीं निकाल पा रहा हूं और मैं ऐसा कैसे कर सकता हूं? यह बहुत मददगार होगा। क्षमा करें यदि मैं स्पष्ट नहीं हूं या अपनी समस्या नहीं बता सकता। यह पहली बार है जब मैं स्टैक ओवरफ्लो पर एक प्रश्न पूछ रहा हूं।
जवाब
डेटा को बाहरी URL से Json के रूप में लोड किया गया है। जानकारी को लोड करने के लिए आप इस स्क्रिप्ट का उपयोग कर सकते हैं:
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
प्रिंटों:
...
--------------------------------------------------------------------------------
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>
--------------------------------------------------------------------------------
...
संपादित करें: CSV को बचाने के लिए, आप इस स्क्रिप्ट का उपयोग कर सकते हैं:
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')
पैदा करता है: