【问题标题】:Scrape html table for information (python)抓取 html 表以获取信息(python)
【发布时间】:2019-07-16 01:50:08
【问题描述】:

我一直在尝试从证券交易所的表格中获取一些信息 (https://www.idx.co.id/en-us/listed-companies/company-profiles/)

使用 python(lxml、requests 和 pandas) 这是我使用的参考:

https://towardsdatascience.com/web-scraping-html-tables-with-python-c9baba21059

由于我是 python/编程的绝对新手,也许有人知道如何仅在 tablebody 中的行元素上应用 .xpath 然后提取内容?我也研究过使用 bs4/beautifulsoup,但也没有让它工作。非常感谢任何帮助或建议!感谢您的宝贵时间

我的代码

from lxml import html as lh
import requests
import pandas as pd

#create a handle page to handle the contents of the website
page = requests.get('http://www.idx.co.id/en-us/listed-companies/company-profiles/')
# stores contents under doc
doc = lh.fromstring(page.content)
#parses data stored in between <tr>..<tr> of the html
tr_elements = doc.xpath('//*[@id="companyTable"]/tbody')

#create empty list
col = []
i = 0

for j in range(0,len(tr_elements)):
    #T is our j'th row
    T = tr_elements[j]

    #If row is not of size 4, the //tr data is not from our table
    if len(T)!=4:
        break

    # i is column index
    i=0

    # Iterate through each element of the row
    for t in T.iterchildren():
        data = t.text_content()

        #Append the data to the empty list of the i'th column
        col[i][1].append(data)

        #Increment i for the next column
        i+=1
[len(C) for (title,C) in col] # checking no of values in all columns

Dict = {title:column for (title,column) in col}
df = pd.DataFrame(Dict)

print(df)

打印输出(df)

Empty DataFrame
Columns: []
Index: []

预期输出:

Columns: [No, Code, Name, Listing Date]  
Index: [1, AALI, Astra Agro Lestari Tbk, 09 Dec 1997]

【问题讨论】:

  • 也许这个thread 能帮上忙。
  • 嘿@Yusuf 感谢您的推荐,遗憾的是我不太了解将其应用于我的问题。我将不得不用我的周末来阅读文档,我最终会得到它。
  • 如果代码运行良好,您能否提供预期的输出?
  • 我认为无法访问表中的td 元素。这就是为什么结果总是空的。尝试使用selenium,参考here
  • @Yusuf 所以我仍然在努力让它工作,但你肯定让我走上了使用硒的正确道路。非常感谢您,非常感谢您的帮助!

标签: python html pandas lxml


【解决方案1】:

无法得到空结果的原因是页面使用 AJAX 加载表格内容(它使用https://datatables.net)。如果要抓取 javascript 生成的结果,requests 是不够的,因为它不执行 javascript。您需要使用selenium-python 之类的库来运行浏览器或无头浏览器(例如Chromedriver)。如果你想走这条路,internet 中有很多教程。

但是,还有更好的方法。如果你理解how AJAX works,页面显然需要调用一个API来检索数据。找到它后,您只需几行代码即可直接使用该 API 轻松检索数据:

import requests
import pandas as pd

res = requests.get('https://www.idx.co.id/umbraco/Surface/ListedCompany/GetCompanyProfiles?draw=1&columns%5B0%5D%5Bdata%5D=KodeEmiten&columns%5B0%5D%5Bname%5D&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=false&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=KodeEmiten&columns%5B1%5D%5Bname%5D&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=false&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=NamaEmiten&columns%5B2%5D%5Bname%5D&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=false&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=TanggalPencatatan&columns%5B3%5D%5Bname%5D&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=false&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&start=0&length=700&search%5Bvalue%5D&search%5Bregex%5D=false&_=155082600847')
data = res.json()
df = pd.DataFrame.from_dict(data['data'])
print(df.columns)
print(df)

结果:

Index(['Alamat', 'BAE', 'DataID', 'Divisi', 'EfekEmiten_EBA', 'EfekEmiten_ETF',
       'EfekEmiten_Obligasi', 'EfekEmiten_SPEI', 'EfekEmiten_Saham', 'Email',
       'Fax', 'JenisEmiten', 'KegiatanUsahaUtama', 'KodeDivisi', 'KodeEmiten',
       'Logo', 'NPKP', 'NPWP', 'NamaEmiten', 'PapanPencatatan', 'Sektor',
       'Status', 'SubSektor', 'TanggalPencatatan', 'Telepon', 'Website', 'id'],
      dtype='object')
                                                Alamat ... id
0    Jl Pulo Ayang Raya Blok OR No. 1  Kawasan Indu... ...  0
1    Sahid Office Boutique, Blok G Jl Jend Sudirman... ...  0
2    Plaza ABDA Lt. 27  Jl. Jend. Sudirman Kav. 59 ... ...  0
3    Gedung TMT 1 Lantai 18  Jl. Cilandak KKO No. 1... ...  0
4    Gedung Kawan Lama Lantai 5  Jl. Puri Kencana N... ...  0
5    ACSET Building, Jalan Majapahit No.26, Kelurah... ...  0
6    Perkantoran Hijau Arkadia Tower C Lantai 15\rJ... ...  0
7         Jalan Raya Pasar Minggu Km. 18 Jakarta 12510 ...  0
8    Gedung The Landmark I Lantai 26-31\r\nJl. Jend... ...  0
9    Gedung Wisma 46 Kota BNI Kav 1 LT. 20 JL Jend.... ...  0
..                                                 ... ... ..
620  Gedung Graha Irama lt. 2-E\rJl. H.R. Rasuna Sa... ...  0
621  Plaza Mutiara Lt. 5,\rJl. Dr. Ide Anak Agung G... ...  0
622  Jl. Jemur Sari Selatan IV/3, \r\nSurabaya 6023... ...  0
623  Jl. Pantai Indah Selatan I, Elang Laut Blok A ... ...  0
624  Jalan Karet Pedurenan No. 240, Karet Kuningan,... ...  0

[625 rows x 27 columns]

【讨论】:

  • 非常感谢!我可以知道您如何获取 API 的网址吗?我已经尝试通过查看 html 在特定公司页面上自己找到它,但是虽然我确实看到了对 /umbraco 的引用,但我似乎无法找到获取实际 url 的方法。无论哪种方式,tiri makasih pak!
  • 我刚刚使用 Chrome 开发者工具来监控 XHR 网络请求。如果我没记错的话,页面里只有3个所以我只是一个一个检查了developers.google.com/web/tools/chrome-devtools/network/…
猜你喜欢
  • 1970-01-01
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多