iT邦幫忙

0

如何將本機HTML檔案特定表格抓取前五大的數字

不好意思下了這麼拗口的標題><
想請問各位大大python有甚麼方法可以把下圖紅框處的部分抓前五名的數字呢?

我一開始的想法是用BeautifulSoup套件將指定表格的內容爬出來
再將紅框數字部份存到陣列裡取前五名
結果不幸的事發生了
這份HTML檔案所有table的class name和格式都一樣
也完全沒有id
所以我完全沒辦法去指定我要抓的特定表格
每個table間唯一不一樣的地方只有下圖紅框處的"summary"

請問這種HTML是不是不能用BeautifulSoup去爬呢?
如果是的話要用甚麼方式完成比較好呢?
謝謝各位大師的幫忙!
下列連結為HTML檔案:
https://drive.google.com/file/d/1ul6c6fUaszUw3cwYHcN9rww6iOH0ptiD/view?usp=sharing
我自己目前寫的程式碼如下:

import bs4 
path = './B2BDB1.html' 
with open(path, 'r') as f: 
    soup = bs4.BeautifulSoup(f.read(), 'html.parser') 
    titles = soup.find_all("table")[29]
for title in titles: 
    print(titles) 

/images/emoticon/emoticon13.gif

看更多先前的討論...收起先前的討論...
froce iT邦大師 1 級 ‧ 2021-06-28 15:55:18 檢舉
去查css selector
table[summary='This table display top SQL by CPU time']
可以用美湯去爬啊,只是要用for ... in 去枚舉每一行逐個欄位去append到list,沒法用名字而已
froce iT邦大師 1 級 ‧ 2021-06-28 16:03:21 檢舉
不過說真的,要爬這種的,用pandas來做吧...
https://pbpython.com/pandas-html-table.html
lulu_meat iT邦研究生 5 級 ‧ 2021-06-28 16:13:54 檢舉
謝謝各位大神回覆!!
這份檔案的表格有夠多 我又有夠菜 只知道美麗湯和selenium這兩種(好無知)
我會去研究一下pandas要怎麼使用(希望我做的出來)
再次謝謝各位大大!
ccutmis iT邦高手 2 級 ‧ 2021-06-28 16:16:34 檢舉
這邊大師很多 我就不土法煉鋼了 簡單來說分兩部份處理
1. 從爬出來的源碼中箤取 出 table的部份
2. table資料轉換到 pandas 取得 某欄位的 top 5 (這部份可以在google搜到不少範例,例如搜: 'python pandas top 5')
froce iT邦大師 1 級 ‧ 2021-06-28 16:33:59 檢舉
然後,你不放份範例的html code誰有辦法幫你寫啦...
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
1
froce
iT邦大師 1 級 ‧ 2021-06-29 08:53:50
最佳解答
from pyquery import PyQuery as pq
import pandas as pd

html = None
with open("B2BDB1.html", "r") as f:
    html = pq("".join(f.readlines()))
    
table = html.find('table[summary="This table displays top SQL by CPU time"]')
tabledf = pd.read_html(table.outer_html())[0]
print(tabledf.sort_values("Elapsed Time (s)", ascending=False)[:5])

這時候就是大喊pandas真好用就對了。

lulu_meat iT邦研究生 5 級 ‧ 2021-06-29 10:38:34 檢舉

謝謝大神!!
我去查了一下pandas教學 學會把兩列相除比大小了
好開心...
pandas真好用!

1
rogeryao
iT邦超人 8 級 ‧ 2021-06-28 16:22:18

請參閱 : How to only get data of first table on a Wikipedia page using BeautifulSoup?

# find all table ,get the first
table = soup.find_all('table', class_="wikitable")[0]  # Only use the first table
lulu_meat iT邦研究生 5 級 ‧ 2021-06-28 17:19:57 檢舉

謝謝roger大師! 我剛剛試成功了! 可以把指定表格抓出來!

1
海綿寶寶
iT邦大神 1 級 ‧ 2021-06-28 16:46:02

你這個報表是 AWR ordered by CPU time
建議可以改用 AWR ordered by Elapsed time
再去取前五名
就不用自己排序

參考這篇

lulu_meat iT邦研究生 5 級 ‧ 2021-06-28 17:08:00 檢舉

謝謝大師回覆!
因為這份報表是主管產出的
他直接請我把某個表格的資料作排序
我也不好意思請他改用別的報表>//<

主管應該有他的用意

加油囉
祝妳好運

我要發表回答

立即登入回答