Trích xuất dữ liệu bảng từ web bằng python

Aug 17 2020

Tôi cần trích xuất một bảng từ trang web "https://geniusimpex.org/pakistan-import-data/" có hàng nghìn hàng, vì vậy tôi muốn tự động hóa quy trình bằng cách sử dụng bs4 và selen nhưng khi tôi trích xuất bảng chỉ tiêu đề bảng được trích xuất. Đây là mã tôi đã sử dụng

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'))  

Nó hiển thị đầu ra sau
[1]:https://i.stack.imgur.com/GItzv.png

Như bạn có thể thấy chỉ có hàng đầu tiên được trích xuất. Ai đó có thể vui lòng cho tôi biết tại sao tôi không thể trích xuất bảng và làm thế nào tôi có thể làm như vậy không? Nó sẽ rất hữu dụng. Xin lỗi nếu tôi không rõ hoặc không thể giải thích vấn đề của mình. Đây là lần đầu tiên tôi đặt câu hỏi về vấn đề tràn ngăn xếp.

Trả lời

1 AndrejKesely Aug 17 2020 at 18:58

Dữ liệu được tải từ URL bên ngoài dưới dạng Json. Bạn có thể sử dụng tập lệnh này để tải thông tin:

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

Bản in:

...

--------------------------------------------------------------------------------
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>
--------------------------------------------------------------------------------


...

CHỈNH SỬA: Để lưu vào CSV, bạn có thể sử dụng tập lệnh này:

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')

Sản xuất: