अजगर का उपयोग करके वेब से तालिका डेटा निकालना

Aug 17 2020

मुझे एक वेबसाइट "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

जैसा कि आप देख सकते हैं केवल पहली पंक्ति निकाली गई है। क्या कोई मुझे बता सकता है कि मैं टेबल क्यों नहीं निकाल पा रहा हूं और मैं ऐसा कैसे कर सकता हूं? यह बहुत मददगार होगा। क्षमा करें यदि मैं स्पष्ट नहीं हूं या अपनी समस्या नहीं बता सकता। यह पहली बार है जब मैं स्टैक ओवरफ्लो पर एक प्रश्न पूछ रहा हूं।

जवाब

1 AndrejKesely Aug 17 2020 at 18:58

डेटा को बाहरी 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')

पैदा करता है: