Pandas完美讀取html格式的Excel所有隱藏數據

      網友投稿 1031 2022-05-30

      大家好,我是小小明。

      你是否有遇到這樣的情況在一些網站導出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

      rId1 rId2 rId3

      1

      2

      3

      4

      5

      6

      可以看到對應的值都順利獲取到。

      Pandas完美讀取html格式的Excel所有隱藏數據

      HTML

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:八十六、推薦組件的redux-thunk異步解決方案、Ajax獲取推薦數據
      下一篇:Spark環境搭建——on yarn集群模式
      相關文章
      亚洲电影免费观看| 无码乱人伦一区二区亚洲| 久久久久亚洲av无码专区| 精品亚洲一区二区| 国产亚洲精品自在久久| 久久国产成人亚洲精品影院 | 亚洲国产成人久久一区久久 | 日本系列1页亚洲系列| 亚洲av日韩aⅴ无码色老头| 亚洲国产aⅴ成人精品无吗| 亚洲精品天堂成人片AV在线播放 | 亚洲avav天堂av在线不卡| 久久国产亚洲电影天堂| 亚洲福利在线观看| 亚洲日本中文字幕区| 亚洲理论片在线中文字幕| 亚洲乱码卡一卡二卡三| 久久乐国产综合亚洲精品| 亚洲中文字幕无码久久2020 | 久久香蕉国产线看观看亚洲片| 亚洲av无码乱码国产精品| 亚洲福利在线视频| 亚洲黄色在线电影| 亚洲日本人成中文字幕| 日本亚洲免费无线码| 亚洲精品色播一区二区| va亚洲va日韩不卡在线观看| 亚洲国产综合久久天堂| 亚洲一区二区三区影院| 亚洲av无码乱码国产精品| 亚洲综合在线成人一区| 亚洲av无码不卡久久| 亚洲欧美精品午睡沙发| 亚洲AⅤ优女AV综合久久久| 亚洲性久久久影院| 亚洲av无码一区二区乱子伦as| 久久久久亚洲av无码专区| 国产成人精品日本亚洲网址| 亚洲国产成人久久精品软件| 亚洲国产综合精品一区在线播放| 亚洲精品美女久久久久99|