一篇我們介紹了如何解析CSV和JSON數據:如何解析互聯網數據:CSV和JSON篇,今天我們將介紹如何解析HTML和XML數據。
今天的介紹能夠幫助你輕而易舉地從網頁中(比如下面的中航電子的2017年一季度交易數據)提取自己想要的數據:
準備
在Python中可以解析html和xml數據的軟件包很多,今天我們介紹的是lxml,先安裝:
$ pip install lxml
如果不熟悉pip的使用,可以參考另一篇文章:如何管理python軟件包。
解析HTML數據
首先,回顧一下HTML的一些基本概念:
標簽/tag:比如<html>, <h1>, <head>...一般成對出現,例如開始標簽<html>和結束標簽</html>
元素/element:開始標簽到結束標簽整段代碼,標簽對之間的即為內容(content)
屬性/attribute:標簽可擁有key=value形式的屬性,比如<div class="header">...</div>
簡單地理解,HTML網頁就是由一組元素構成的一個集合。另外,大多數HTML標簽是可以嵌套的,因此元素可以包含一系列子元素。有了這些概念做基礎,我們將能夠很容易理解軟件包lxml的使用。實際上,在lxml里面,每個HTML元素對應一個lxml.html.HtmlElement對象,該對象提供一組標準的方法取訪問包含在該元素內部的數據,比如屬性、內容和子元素等。
例子
考察下面的鏈接,它提供中航電子在2017年第一季度的交易數據,我們打算從里面提取一些數據:
>>> url = "http://quotes.money.163.com/trade/lsjysj_600372.html?year=2017&season=1"
先把該網頁爬取下來:
>>> import urllib2
>>> rsp = urllib2.urlopen(url).read()
>>> print rsp[0:15]
<!DOCTYPE html>
將字符串rsp轉換成HtmlElement對象:
>>> from lxml import html
>>> doc = html.document_fromstring(rsp)
>>> type(doc)
<class 'lxml.html.HtmlElement'>
>>> doc.tag
'html'
所以其實doc就是一個html元素,它包含一些元素,比如head, body, link, div...
比如,如果你想提取該網頁里面所有的鏈接(links):
>>> links = [ link for link in doc.iterlinks() ]
>>> len(links)
106
>>> links[0]
(<Element link at 0x1029179f0>, 'href', 'http://img1.cache.netease.com/f2e/finance/gegu/s.1064000.css', 0)
>>> links[0][2]
'http://img1.cache.netease.com/f2e/finance/gegu/s.1064000.css'
如果你想查看元素直接包含哪些子元素,可以調用getchildren()方法:
>>> doc.getchildren()
[<Element head at 0x10299a0a8>, <Element body at 0x10299a470>]
對嵌套很深的元素,如果熟悉xpath表達式,最直接的辦法是調用xpath(...)方法:
>>> [ td.text for td in doc.xpath('/html/body/div[2]/div[4]/table/tr[1]/td')]
['2017-03-31', '19.02', '19.50', '19.02', '19.30', '0.36', '1.90', '102,212', '19,747', '2.53', '0.58']
此外,還可以通過find, findall, find_class, get_element_by_id等方法查找目標元素,比如:
>>> [ td.text for td in doc.findall('./body/div[2]/div[4]/table/tr[1]/td')]
['2017-03-31', '19.02', '19.50', '19.02', '19.30', '0.36', '1.90', '102,212', '19,747', '2.53', '0.58']
如果元素有屬性,提取屬性值也很方便,比如:
>>> form = doc.forms[0]
>>> form.tag
'form'
>>> form.attrib
{'action': '/trade/lsjysj_600372.html', 'id': 'date'}
>>> form.keys()
['id', 'action']
>>> form.get('action')
'/trade/lsjysj_600372.html'
>>> form.items()
[('id', 'date'), ('action', '/trade/lsjysj_600372.html')]
'>>> form.form_values()
[('year', '2017'), ('season', '1')]
>>> form.method
'GET'
做為一個完整的例子,下面的腳本就是爬取中航電子在2017年第一季度的數據:
輸出效果:
(test) $ head -3 600372.csv
日期;開盤價;最高價;最低價;收盤價;漲跌額;漲跌幅(%);成交量(手);成交金額(萬元);振幅(%);換手率(%)
2017-03-31;19.02;19.50;19.02;19.30;0.36;1.90;102,212;19,747;2.53;0.58
2017-03-31;19.02;19.50;19.02;19.30;0.36;1.90;102,212;19,747;2.53;0.58
解析xml數據
xml的格式和HTML類似,也是由標簽構成的,但是要比HTML文件簡單許多,看下面的xml文件片段處理:
>>> xmlstr="""\
... <target name="run" depends="jar">
... <java fork="true" classname="${main-class}">
... <classpath>
... <path refid="classpath"/>
... <path refid="application"/>
... </classpath>
... </java>
... </target>"""
>>> from lxml import etree
第一步是獲取根節點:
>>> root = etree.fromstring(xmlstr)
>>> root.tag
'target'
如果要提取節點屬性:
>>> root.items()
[('name', 'run'), ('depends', 'jar')]
>>> root.keys()
['name', 'depends'
>>> root.get("name")
'run'
>>> root.values()
['run', 'jar']
可以使用find, xpath等方法去獲取和查找子節點:
>>> java = root.find("./java")
>>> java.tag
'java'
>>> java.keys()
['fork', 'classname']
>>> [ path.get("refid") for path in root.xpath("http://path")]
['classpath', 'application']
lxml軟件的功能很強大,如果有興趣進一步了解,可以查看官方文檔:
http://lxml.de/index.html
今天就寫這么,歡迎大家留言、評論和關注。
tmlAgilityPack是一個.NET平臺下的HTML解析庫,它可以將HTML文本轉換為DOM文檔對象,方便我們對HTML文本進行操作和分析。HtmlAgilityPack支持XPath語法,可以通過XPath表達式來獲取DOM節點,同時還提供了一些方便的API,可以實現HTML文本的解析、修改、生成等功能。本文將詳細介紹HtmlAgilityPack的使用及使用方法。
一、HtmlAgilityPack的安裝
HtmlAgilityPack是一個NuGet包,可以通過Visual Studio的NuGet包管理器來安裝。具體步驟如下:
安裝完成后,就可以在項目中使用HtmlAgilityPack了。
二、HtmlAgilityPack的使用
使用HtmlAgilityPack解析HTML文本的第一步是將HTML文本加載到一個HtmlDocument對象中。可以通過以下代碼來實現:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);
其中,htmlText是要解析的HTML文本。LoadHtml方法會將HTML文本解析成一個DOM文檔對象,并存儲在doc對象中。
HtmlAgilityPack提供了一些方法來獲取DOM節點,例如GetElementById、GetElementsByTagName、SelectSingleNode、SelectNodes等。這些方法都接受一個XPath表達式作為參數,用來指定要獲取的節點。以下是一些示例代碼:
// 獲取id為"content"的節點
HtmlNode contentNode = doc.GetElementById("content");
// 獲取所有的a標簽
HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");
// 獲取第一個p標簽
HtmlNode pNode = doc.DocumentNode.SelectSingleNode("//p");
其中,XPath表達式的語法與XML的XPath語法相同。在這里不再詳細介紹。
HtmlAgilityPack提供了一些方法來修改DOM節點,例如SetAttributeValue、InnerHtml、OuterHtml等。以下是一些示例代碼:
// 修改id為"content"的節點的class屬性
contentNode.SetAttributeValue("class", "new-class");
// 修改第一個p標簽的內容
pNode.InnerHtml = "這是新的內容";
// 修改第一個a標簽的href屬性
HtmlNode aNode = aNodes[0];
aNode.SetAttributeValue("href", "http://www.example.com");
HtmlAgilityPack還可以將DOM文檔對象轉換為HTML文本。可以通過以下代碼來實現:
string newHtmlText = doc.DocumentNode.OuterHtml;
其中,OuterHtml屬性返回DOM文檔對象的HTML文本表示。
三、HtmlAgilityPack的功能實例
下面將通過一些具體的實例來演示HtmlAgilityPack的使用方法。
以下代碼演示了如何獲取頁面標題:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);
HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//title");
string title = titleNode.InnerHtml;
其中,htmlText是要解析的HTML文本。首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//title”獲取頁面標題節點。最后,通過InnerHtml屬性獲取標題的內容。
以下代碼演示了如何獲取頁面中的所有圖片:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);
HtmlNodeCollection imgNodes = doc.DocumentNode.SelectNodes("//img");
foreach (HtmlNode imgNode in imgNodes)
{
string src = imgNode.GetAttributeValue("src", "");
Console.WriteLine(src);
}
首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//img”獲取所有圖片節點。最后,遍歷所有圖片節點,獲取每個節點的src屬性。
以下代碼演示了如何獲取頁面中的所有鏈接:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);
HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");
foreach (HtmlNode aNode in aNodes)
{
string href = aNode.GetAttributeValue("href", "");
Console.WriteLine(href);
}
首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//a”獲取所有鏈接節點。最后,遍歷所有鏈接節點,獲取每個節點的href屬性。
以下代碼演示了如何將頁面中的所有鏈接修改為指定的鏈接:
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(htmlText);
HtmlNodeCollection aNodes = doc.DocumentNode.SelectNodes("//a");
foreach (HtmlNode aNode in aNodes)
{
aNode.SetAttributeValue("href", "http://www.example.com");
}
string newHtmlText = doc.DocumentNode.OuterHtml;
首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//a”獲取所有鏈接節點。最后,遍歷所有鏈接節點,將它們的href屬性修改為指定的鏈接。最后,通過OuterHtml屬性將修改后的DOM文檔對象轉換為HTML文本。
本文介紹了HtmlAgilityPack的使用及使用方法。HtmlAgilityPack是一個功能強大、易用性高的HTML解析庫,可以方便地對HTML文本進行操作和分析。通過本文的介紹,讀者可以了解HtmlAgilityPack的基本用法,并可以根據需要自行擴展。
【大廠面試】Java中的序列化和反序列化它們的作用和用途是什么?
.net core下優秀的日志框架使用解析,附源代碼
Spring Boot+Vue全棧開發實戰,中文版高清PDF資源
作者簡介:
【架構師老盧】20年資深軟件架構師,分享編程、軟件設計經驗,教授前沿技術,分享技術資源,分享職場感悟
據分析常用哪些Python包?這里將其總結如下,比如在數據清洗時使用到numpy和pandas包,數據可視化時使用matplotlib庫,matplotlib庫上手容易,更高級的學習seaborn庫,seaborn庫是改良matplotlib庫的圖表畫法,如果創建有交互性的圖表,可以使用Pyecharts庫。
Python的作用絕不僅僅只是做數據清洗和數據可視化,其作用還有很多,有許多意想不到的功能,這里僅僅舉例講講Python在數據分析中使用最多的幾個包,歡迎大家補充,下面一起來學習。
1、Numpy
官網https://www.numpy.org.cn/
NumPy是Python中科學計算的基礎包。它是一個Python庫,提供多維數組對象,各種派生對象,以及用于數組快速操作的各種API,有包括數學、邏輯、形狀操作、排序、選擇、輸入輸出、離散傅立葉變換、基本線性代數,基本統計運算和隨機模擬等等。
NumPy包的核心是 ndarray 對象。它封裝了python原生的同數據類型的 n 維數組,為了保證其性能優良,其中有許多操作都是代碼在本地進行編譯后執行的。
NumPy的主要對象是同構多維數組。它是一個元素表,所有類型都相同,由非負整數元組索引。在NumPy維度中稱為軸 。
2、Pandas
官網https://www.pypandas.cn/
Pandas 是 Python的核心數據分析支持庫,提供了快速、靈活、明確的數據結構,旨在簡單、直觀地處理關系型、標記型數據,廣泛應用于數據分析領域,Pandas 適用于處理與 Excel 表類似的表格數據,以及有序和無序的時間序列數據等。
Pandas 的主要數據結構是 Series(一維數據)和 DataFrame(二維數據),這兩種數據結構足以處理金融、統計、社會科學、工程等領域里的大多數典型用例,使用pandas進行數據分析流程包含數據整理與清洗、數據分析與建模、數據可視化與制表等階段。
3、Matplotlib
官網https://www.matplotlib.org.cn/
Matplotlib是一個Python 2D繪圖庫,它以多種硬拷貝格式和跨平臺的交互式環境生成出版物質量的圖形。Matplotlib可用于Python腳本,Python和IPython Shell、Jupyter筆記本,Web應用程序服務器和四個圖形用戶界面工具包。
Matplotlib 嘗試使容易的事情變得更容易,使困難的事情變得可能,只需幾行代碼就可以生成圖表、直方圖、功率譜、條形圖、誤差圖、散點圖等。
為了簡單繪圖,該 pyplot 模塊提供了類似于MATLAB的界面,尤其是與IPython結合使用時,對于高級用戶,您可以通過面向對象的界面或MATLAB用戶熟悉的一組功能來完全控制線型,字體屬性,軸屬性等。
4、Seaborn
官網http://seaborn.pydata.org/
Seaborn 是一個基于matplotlib的 Python 數據可視化庫,它建立在matplotlib之上,并與Pandas數據結構緊密集成,用于繪制有吸引力和信息豐富的統計圖形的高級界面。
Seaborn 可用于探索數據,它的繪圖功能對包含整個數據集的數據框和數組進行操作,并在內部執行必要的語義映射和統計聚合以生成信息圖,其面向數據集的聲明式 API可以專注于繪圖的不同元素的含義,而不是如何繪制它們的細節。
Matplotlib 擁有全面而強大的 API,幾乎可以根據自己的喜好更改圖形的任何屬性,seaborn 的高級界面和 matplotlib 的深度可定制性相結合,使得Seaborn既可以快速探索數據,又可以創建可定制為出版質量最終產品的圖形。
5、Pyecharts
官網https://pyecharts.org/#/
Echarts 是一個由百度開源的數據可視化,憑借著良好的交互性,精巧的圖表設計,得到了眾多開發者的認可。而 Python 是一門富有表達力的語言,很適合用于數據處理。當數據分析遇上數據可視化時,pyecharts 誕生了。
Pyecharts具有簡潔的 API 設計,使用如絲滑般流暢,支持鏈式調用,囊括了 30+ 種常見圖表,應有盡有,支持主流 Notebook 環境,Jupyter Notebook 和 JupyterLab,擁有高度靈活的配置項,可輕松搭配出精美的圖表。
Pyecharts強大的數據交互功能,使數據表達信息更加生動,增加了人機互動效果,并且數據呈現效果可直接導出為html文件,增加數據結果交互的機會,使得信息溝通更加容易。
Pyecharts有著豐富的圖表素材,支持鏈式調用,如下是使用Pyecharts的地理圖表功能,空間上直觀顯示數據可視化效果。
更多實用的數據分析知識,關注我,持續創作數據分析內容~
*請認真填寫需求信息,我們會在24小時內與您取得聯系。