Pandas完美讀取html格式的Excel所有隱藏數據
大家好,我是小小明。
你是否有遇到這樣的情況在一些網站導出Excel文件后,用pandas卻無法直接以Excel方式讀取。
本文就將遇到的這種情況,帶你去完整的解析讀取。
問題分析
有一個文件用Excel軟件打開可以看到如下數據:
但嘗試用pandas直接讀?。?/p>
import pandas as pd df = pd.read_excel("明細費用表1.xlsx") df
1
2
3
4
結果報出:
ValueError: File is not a recognized excel file
1
這時我們可以考慮一下,這個問題有沒有可能時間是csv等文本格式,于是用文本解析器打開看看:
原來這是一個html文檔,那么我們就可以以純html的方式讀取它了:
但是可以很明顯的看到pandas的網頁讀取,有大量數據并沒有讀取到。
這時候我們可以考慮使用pywin32轉換格式,也可以通過網頁解析直接提取需求的數據。
網頁結構分析
首先分析一下主要的結構。
首先是表頭:
很明顯Excel表中的隱藏列就是受display:none的CSS樣式控制。
再看看數據行:
可以看到整數類型的數據都存在于屬性x:num中,而不是內部的文本節點中。
下面我們使用xpath來解析數據:
解析數據
經時間測試發現,帶有x:的命名空間下的數據,幾乎無法通過正常的方法解析獲取,或者說非常麻煩。所以我們一次性去掉所有的x:前綴后,再讀取數據并加載:
import pandas as pd from lxml import etree with open("明細費用表1.xlsx", encoding="u8") as f: html = etree.HTML(f.read().replace("x:", ""))
1
2
3
4
5
最終我編寫的解析代碼如下:
header = None data = [] for tr in html.xpath("http://table/tr"): row = [] for td in tr.xpath("./td"): num = td.xpath("./@num") if num and num[0]: row.append(float(num[0])) else: row.append("".join(td.xpath(".//text()"))) if len(row) < 4: continue if header is None: header = row else: data.append(row) df = pd.DataFrame(data, columns=header) df
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
可以看到這下子,數據就全部都讀取出來了。
解析帶有命名空間xml的標準方法
前面對于xmlns:x="urn:schemas-microsoft-com:office:excel"的命名空間,我沒有找到好的方法解析,只能直接替換原始文本刪除。當對于正常的帶有命名空間的數據xpath還是有標準方法解析的。
比如對于如下xml:
from lxml import etree xml = etree.parse("drawing1.xml") print(etree.tostring(xml, pretty_print=True).decode("utf-8"))
1
2
3
4
我們希望取出其中的a:blip節點下的r:embed屬性:
namespaces = {"r": "http://schemas.openxmlformats.org/officeDocument/2006/relationships", "a": "http://schemas.openxmlformats.org/drawingml/2006/main"} for e in xml.xpath("http://a:blip", namespaces=namespaces): print(etree.tostring(e).decode("utf-8")) print(e.xpath("./@r:embed", namespaces=namespaces)[0])
1
2
3
4
5
1
2
3
4
5
6
可以看到對應的值都順利獲取到。
HTML
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。