【问题标题】:Extracting table data from web using python使用python从网络中提取表格数据
【发布时间】:2020-12-06 13:00:37
【问题描述】:

我需要从网站“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

如您所见,仅提取了第一行。有人可以告诉我为什么我无法提取表格,我该怎么做?这将非常有帮助。抱歉,如果我不清楚或无法解释我的问题。这是我第一次提出堆栈溢出问题。

【问题讨论】:

  • 这可能是各种各样的事情。通过将相关代码发布到您的问题来帮助我们为您提供帮助。
  • 我怀疑您正在使用 bs4 来尝试提取表格。如果表格是由 javascript 呈现的,那么这是不可能的,因为数据没有时间加载。尝试使用 selenium 提取表的这一部分。
  • 我认为你是对的,但我也使用了 selenium,结果是一样的。除了第一行之外,它无法检测到任何其他行。

标签: python python-3.x beautifulsoup automation data-extraction


【解决方案1】:

数据作为 Json 从外部 URL 加载。您可以使用此脚本来加载信息:

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

生产:

【讨论】:

  • 非常感谢兄弟。但是有什么方法可以提取超过 1000 行?
  • @UmairAmir 运行此脚本将在每次迭代中加载 1000 行,直到读取所有行(查看 offset 变量)
  • 是的!这是工作。谢谢你。有没有办法让我将所有这些数据粘贴到 excel 中?
  • @UmairAmir 只需在 Excel 中打开生成的 csv 文件。
  • 非常感谢兄弟。你无法想象这对我来说意味着什么。
猜你喜欢
  • 2012-05-15
  • 2019-05-20
  • 2020-03-17
  • 1970-01-01
  • 2019-04-17
  • 2020-06-14
  • 1970-01-01
  • 2016-03-06
  • 2015-06-28
相关资源
最近更新 更多