整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何使用Pandas read_html從HTML表格中獲取數據

          本Pandas教程中,我們將詳細介紹如何使用Pandas read_html方法從HTML中獲取數據。首先,在最簡單的示例中,我們將使用Pandas從一個字符串讀取HTML。其次,我們將通過幾個示例來使用Pandas read_html從Wikipedia表格中獲取數據。在之前的一篇文章(關于Python中的探索性數據分析)中,我們也使用了Pandas從HTML表格中讀取數據。

          在Python中導入數據

          在開始學習Python和Pandas時,為了進行數據分析和可視化,我們通常從實踐導入數據開始。在之前的文章中,我們已經了解到我們可以直接在Python中輸入值(例如,從Python字典創建Pandas dataframe)。然而,通過從可用的源導入數據來獲取數據當然更為常見。這通常是通過從CSV文件或Excel文件中讀取數據來完成的。例如,要從一個.csv文件導入數據,我們可以使用Pandas read_csv方法。這里有一個如何使用該方法的快速的例子,但一定要查看有關該主題的博客文章以獲得更多信息。

          現在,上面的方法只有在我們已經有了合適格式的數據(如csv或JSON)時才有用(請參閱關于如何使用Python和Pandas解析JSON文件的文章)。

          我們大多數人會使用Wikipedia來了解我們感興趣的主題信息。此外,這些Wikipedia文章通常包含HTML表格。

          要使用pandas在Python中獲得這些表格,我們可以將其剪切并粘貼到一個電子表單中,然后,例如使用read_excel將它們讀入Python。現在,這個任務當然可以用更少的步驟來完成:我們可以通過web抓取來對它進行自動化。一定要查看一下什么是web抓取。

          先決條件

          當然,這個Pandas讀取HTML教程將要求我們安裝Pandas及其依賴項。例如,我們可以使用pip來安裝Python包,比如Pandas,或者安裝一個Python發行版(例如,Anaconda、ActivePython)。下面是如何使用pip安裝Pandas: pip install pandas。

          注意,如果出現消息說有一個更新版本的pip可用,請查看這篇有關如何升級pip的文章。注意,我們還需要安裝lxml或BeautifulSoup4,當然,這些包也可以使用pip來安裝: pip install lxml。

          Pandas read_html 語法

          下面是如何使用Pandas read_html從HTML表格中抓取數據的最簡單的語法:

          現在我們已經知道了使用Pandas讀取HTML表格的簡單語法,接下來我們可以查看一些read_html示例。

          Pandas read_html 示例1:

          第一個示例是關于如何使用Pandas read_html方法的,我們將從一個字符串讀取HTML表格。

          現在,我們得到的結果不是一個Pandas DataFrame,而是一個Python列表。也就是說,如果我們使用type函數,我們可以看到:

          如果我們想得到該表格,我們可以使用列表的第一個索引(0)

          Pandas read_html 示例 2:

          在第二個Pandas read_html示例中,我們將從Wikipedia抓取數據。實際上,我們將得到蟒科蛇(也稱為蟒蛇)的HTML表格。

          現在,我們得到了一個包含7個表(len(df))的列表。如果我們去Wikipedia頁面,我們可以看到第一個表是右邊的那個。然而,在本例中,我們可能對第二個表更感興趣。

          Pandas read_html 示例 3:

          在第三個示例中,我們將從瑞典的covid-19病例中讀取HTML表。這里,我們將使用read_html方法的一些附加參數。具體來說,我們將使用match參數。在此之后,我們還需要清洗數據,最后,我們將進行一些簡單的數據可視化操作。

          使用Pandas read_html和匹配參數抓取數據:

          如上圖所示,該表格的標題為:“瑞典各郡新增COVID-19病例”。現在,我們可以使用match參數并將其作為一個字符串輸入:

          通過這種方式,我們只得到這個表,但它仍然是一個dataframes列表。現在,如上圖所示,在底部,我們有三個需要刪除的行。因此,我們要刪除最后三行。

          使用Pandas iloc刪除最后的行

          現在,我們將使用Pandas iloc刪除最后3行。注意,我們使用-3作為第二個參數(請確保你查看了這個Panda iloc教程,以獲得更多信息)。最后,我們還創建了這個dataframe的一個副本。

          在下一節中,我們將學習如何將多索引列名更改為單個索引。

          將多索引更改為單個索引并刪除不需要的字符

          現在,我們要去掉多索引列。也就是說,我們將把2列索引(名稱)變成唯一的列名。這里,我們將使用DataFrame.columns 和 DataFrame.columns,get_level_values:

          最后,正如你在“date”列中所看到的,我們使用Pandas read_html從WikiPedia表格抓取了一些注釋。接下來,我們將使用str.replace方法和一個正則表達式來刪除它們:

          使用Pandas set_index更改索引

          現在,我們繼續使用Pandas set_index將日期列變成索引。這樣一來,我們稍后就可以很容易地創建一個時間序列圖。

          現在,為了能夠繪制這個時間序列圖,我們需要用0填充缺失的值,并將這些列的數據類型更改為numeric。這里我們也使用了apply方法。最后,我們使用cumsum方法來獲得列中每個新值累加后的值:

          來自HTML表格的時間序列圖

          在最后一個示例中,我們使用Pandas read_html獲取我們抓取的數據,并創建了一個時間序列圖。現在,我們還導入了matplotlib,這樣我們就可以改變Pandas圖例的標題的位置:

          結論: 如何將HTML讀取到一個 Pandas DataFrame

          在這個Pandas教程中,我們學習了如何使用Pandas read_html方法從HTML中抓取數據。此外,我們使用來自一篇Wikipedia文章的數據來創建了一個時間序列圖。最后,我們也可以通過參數index_col來使用Pandas read_html將' Date '列設置為索引列。

          英文原文:https://www.marsja.se/how-to-use-pandas-read_html-to-scrape-data-from-html-tables
          譯者:一瞬

          、在線表格編輯器——TablesGenerator

          表格制作工具TablesGenerator是一個在線制作 LaTeX、HTML、Markdown 格式的表格代碼工具,支持在表格中填充數據,修改字體/背景顏色,對齊方式等等,還支持從 Excel、Google Docs 里直接復制粘貼數據,以及多個 HTML 表格樣式。Tables Generator 支持四種格式:LaTeX、HTML、Markdown、TEXT,先在 Table > Set size 中設置表格大小,然后填充數據,設置格式,就能在頁面下面找到代碼了。




          2、在線表格編輯器——思邁特軟件Smartbi


          其以“真Excel”操作的特色,擁有了其它報表軟件望塵莫及的功能特色。只要在Excel端安裝Smartbi報表工具插件,用戶就可以直接在Excel中設計報表格式或進行數據分析。Smartbi表格制作工具巧妙利用Excel自身的表格、圖形、函數的能力,就能夠實現各種BI應用,還可將報表一鍵發布到Web/APP端進行瀏覽,且軟件內置多種免費的表格模板可供使用。

          針對類似模板固定的Word/PPT分析報告,Smartbi利用Office分析報告插件,將報告模板中的數據元素數據(單數字、表格、圖形)從“靜態”變成“動態”,每當需要使用時,數據分析師可以像刷新報表一樣刷新這些分析報告,按照所輸入的參數對報告數據進行解讀、討論、建議,從而將更多時間用在“分析”上。



          3、在線表格編輯器——FCKeditor 編輯器


          FCKeditor 是一款開源的所見所得網頁文本編輯器,可通過CKeditor設置表格,在表格中定義表單元素,主要支持文本框、復選框、單選框、單行文本、多行文本、列表、按鈕、圖片、隱藏域。




          4、在線表格編輯器——Ueditor Formdesign Plugins Web表單設計器


          Ueditor Formdesign 是開源免費的表單設計器,可應用于工作流管理系統、OA等,是一款可視化的Web表單構建器,HTML元素組件較豐富,主要包含:文本框、多行文本、下拉菜單、單選框、復選框、宏控件、進度條等,并可以生成二維碼。




          5、在線表格編輯器——SpreadJS


          SpreadJS 在線Excel表格編輯器,是類似在線Excel功能和外觀的在線表格編輯程序,也是 SpreadJS 桌面設計器的在線版本,提供源代碼,可自由定制,任意擴展。該產品內嵌了SpreadJS,使用離線和在線方式均可進行表格編輯。

          . 前言

          在上一篇中,我故意留下了查詢的示范沒講。雖然說可以通過以下代碼獲取一個DataReader:

          IDataReader reader = command.ExecuteReader();

          然后通過reader一行一行的讀取數據,但是我并不推薦這樣使用。

          在查詢這一高頻需求上,C#為之做了很多工作,提供了更多的選擇。這里介紹一個查詢的另一套寫法。



          1. 離線查詢

          C#在查詢上提供了另一種機制,可以一次性從數據庫把結果讀取到網絡緩存區中,直到使用的時候才加載到程序中。

          在離線查詢里最關鍵的三個接口或類:

          • IDataAdapter 一種適配器,用來獲取數據并填充或更新DataSet
          • DataSet 表示數據在內存中的緩存
          • DataTable 表示內存中一個數據表

          IDataAdapter用來提供數據,DataSet表示adapter讀取的結果集,其中有一個DataTable集合表示執行的SQL查詢結果。至于為什么是集合,是因為IDataAdapter允許運行多條查詢語句。

          好,讓我們粗略瀏覽一下這個三個關鍵點的屬性和方法:

          IDataAdapter:

          public int Fill (System.Data.DataSet dataSet);//將查詢出來的結果填充到DataSet里

          在C#內部,其實不允許推薦直接繼承該接口,推薦繼承DataAdapter類,該類規定了數據庫Adapter在初始化的時候,必須提供一個可以訪問的數據庫連接和要執行的命令文本。

          當然其部分實現類允許以屬性的形式后賦值這兩個關鍵內容。

          DataSet:

          public DataSet ();
          public DataSet (string dataSetName);//指定數據集的名稱
          public System.Data.DataTableCollection Tables { get; }//獲取包含在 DataSet 中的表的集合

          DataSet有很多有用的方法,但是在今天我們只用關系這些就可以了。

          其中Tables 引入了一個沒有提到的類型,DataTableCollection。那么我們可以順藤摸瓜,來看看里面有什么關鍵的內容:

          public System.Data.DataTable this[int index] { get; }// 獲取指定下標的DataTable
          public System.Data.DataTable this[string name] { get; }//獲取具有指定名稱的DataTable

          可以看到提供了一種我們可以獲取到里面的DataTable元素的索引訪問方式。

          DataTable :

          public System.Data.DataSet DataSet { get; }//獲取此表所屬的 DataSet。
          public System.Data.DataColumnCollection Columns { get; }//獲取屬于該表的列的集合
          public System.Data.DataRowCollection Rows { get; }//獲取屬于該表的行的集合

          又出現了兩個新的類:DataColumnCollection、DataRowCollection。這是一種內部集合的實現類,功能類似于List,但又不等同于List。

          我們大概看一下對我們有用的屬性和方法:

          DataColumnCollection:

          public virtual int Count { get; }//獲取集合中的元素總數
          public System.Data.DataColumn this[int index] { get; }//從集合中獲取位于指定索引位置的 DataColumn
          public System.Data.DataColumn this[string name] { get; }//從具有指定名稱的集合中獲取 DataColumn。

          DataRowCollection:

          public override int Count { get; }
          public System.Data.DataRow this[int index] { get; }// 獲取索引處的行

          嗯,好先到此為止。調轉方向回到上個路口,重新來。讓我們看看DataColumn和DataRow又有哪些值得我們現在關注的:

          DataColumn:

          public string ColumnName { get; set; }//獲取或設置 DataColumnCollection 中的列的名稱
          public Type DataType { get; set; }//獲取或設置存儲在列中的數據的類型

          DataRow:

          public object this[System.Data.DataColumn column] { get; set; }//獲取或設置指定 DataColumn 中存儲的數據
          public object this[int columnIndex] { get; set; }//獲取或設置由索引指定的列中存儲的數據
          public object this[string columnName] { get; set; }//獲取或設置由名稱指定的列中存儲的數據
          public object[] ItemArray { get; set; }//通過數組獲取或設置此行的所有值

          到目前為止,離線查詢的支持類和接口就介紹了個大概。那么我們看看如何進行一個離線查詢吧



          2.實踐看看

          以SQL Server數據庫為例:

          獲取一個SqlDataAdapter,C#提供了四種方式獲取:

          public SqlDataAdapter ();//構造一個沒有連接和命令的Adapter對象
          public SqlDataAdapter (System.Data.SqlClient.SqlCommand selectCommand);// 指定一個查詢命令
          public SqlDataAdapter (string selectCommandText, System.Data.SqlClient.SqlConnection selectConnection);//指定查詢命令,和連接
          public SqlDataAdapter (string selectCommandText, string selectConnectionString);//指定查詢命令和連接字符串

          引用命名空間:

          using System.Data;
          using System.Data.SqlClient;

          那么,我們先構造一個Adapter:

          var connectStr = "Data Source=.;Initial Catalog=Old;Integrated Security=True";
          var sql = "select * from Area_PostCode";
          var adapter = new SqlDataAdapter(sql, connectStr);

          然后創建一個用于保存數據的DataSet,并把數據填充進去:

          DataSet set = new DataSet();
          adapter.Fill(set);

          然后可以看到這個set中的數據應該是這樣的:

          上圖是在VS中的調試模式中,可以看到

          根據上圖我們大概可以猜測一下DataTable內部的數據結構,或者C#讓我們理解的結構是什么。

          其中DataColumn對應著圖中列,ColumnName就是圖 所示的列名。而DataRow就是行,ItemArray則是一行行數據。

          這樣一來,顯然就比直接使用IDataReader訪問數據要方便很多。

          依據上例:

          我們試著獲取一下第三行的Province列值,如果覺得這個表述別扭的話,看一下我的寫法,就知道我為什么這么表示了。

          var table = set.Tables[0];// 先拿到第一個表
          var value = table.Rows[2]["Province"];

          這是一種螞蟻搬家式的讀取數據方式。C#為DataTable提供了一個擴展方法:

          public static EnumerableRowCollection<DataRow> AsEnumerable(this DataTable source);

          將表格轉換成可枚舉的DataRow集合。

          所以我們可以用foreach循環來遍歷DataTable。



          3. 未完待續

          在這一節簡單介紹了一下ADO.NET的離線查詢支持。當我們能從數據庫中獲取到DataTable的時候,我們就能通過這個做出更多的事情來。下一章我將帶領大家結合之前介紹的反射,實現一個簡單的ORM工具類。

          更多內容煩請關注我的博客《高先生小屋》


          主站蜘蛛池模板: 国产在线精品一区二区不卡麻豆| 国产精品无码一区二区三区电影| 国产精品一区二区不卡| 色妞色视频一区二区三区四区 | 国产一区二区三区美女| 中文字幕日本精品一区二区三区| 精品成人一区二区三区免费视频 | 国产精品电影一区二区三区| 国产一区二区三区在线观看精品| 亚洲欧美成人一区二区三区| 国产成人无码精品一区二区三区| 久久久久国产一区二区三区| 日韩伦理一区二区| 韩国精品一区二区三区无码视频| 美日韩一区二区三区| 亚洲香蕉久久一区二区三区四区| 成人中文字幕一区二区三区| 日产亚洲一区二区三区| 亚洲国产日韩一区高清在线| 无码人妻一区二区三区在线视频 | 日韩精品一区二区三区国语自制 | 色噜噜狠狠一区二区三区| 国产午夜毛片一区二区三区| 精品成人一区二区三区四区 | 国产AⅤ精品一区二区三区久久| 国产美女视频一区| 中文字幕一区日韩在线视频 | 精品日韩一区二区三区视频| 韩国精品福利一区二区三区| 正在播放国产一区| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 亚洲色无码专区一区| 亚洲精品精华液一区二区| 精品国产福利一区二区| 亚洲码欧美码一区二区三区| 又紧又大又爽精品一区二区| 国产在线观看一区精品 | 蜜桃无码AV一区二区| 亚洲国产一区二区a毛片| 亚洲av无码一区二区三区在线播放| 国产情侣一区二区|