Извлечение табличных данных из Интернета с помощью python

#python #python-3.x #beautifulsoup #automation #data-extraction

#python #python-3.x #beautifulsoup #автоматизация #извлечение данных

Вопрос:

Мне нужно извлечь таблицу с веб-сайта «https://geniusimpex.org/pakistan-import-data /» который содержит около тысяч строк, поэтому я хотел автоматизировать процесс с помощью bs4 и selenium, но когда я извлекаю таблицу, извлекается только заголовок таблицы. Это код, который я использовал

 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. Это может быть что угодно. Помогите нам помочь вам, разместив соответствующий код для решения вашей проблемы.

2. Я подозреваю, что вы используете bs4, чтобы попытаться извлечь таблицу. Если таблица отображается с помощью javascript, то это будет невозможно, поскольку у данных не будет времени для загрузки. Попробуйте использовать selenium для извлечения этой части таблицы.

3. Я думаю, вы правы, но я также использовал selenium, и результат был тот же. Не удалось обнаружить никакой другой строки, кроме первой.

Ответ №1:

Данные загружаются с внешнего URL в формате Json. Вы можете использовать этот скрипт для загрузки информации:

 import json
import requests


url = 'https://geniusimpex.org/wp-admin/admin-ajax.php?action=ge_forecast_list_dataamp;order=ascamp;offset={offset}amp;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/On 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_dataamp;order=ascamp;offset={offset}amp;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')
  

Производит:

введите описание изображения здесь

Комментарии:

1. Большое тебе спасибо, братан. Но есть ли какой-либо способ, которым я могу извлечь более 1000 строк?

2. @UmairAmir Запуск этого скрипта будет загружать 1000 строк на каждой итерации, пока не будут прочитаны все строки (посмотрите на offset переменную)

3. Да! это работает. Спасибо. Есть ли у меня способ вставить все эти данные в Excel?

4. @UmairAmir Просто откройте созданный csv файл в Excel.

5. Большое тебе спасибо, братан. Вы не можете себе представить, как много это значит для меня.