整合營銷服務商

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

          免費咨詢熱線:

          Python如何解析HTML和XML數據

          一篇我們介紹了如何解析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包管理器來安裝。具體步驟如下:

          1. 打開Visual Studio,打開要安裝HtmlAgilityPack的項目。
          2. 在“解決方案資源管理器”中右鍵單擊項目,選擇“管理NuGet程序包”。
          3. 在“NuGet程序包管理器”中搜索“HtmlAgilityPack”,選擇“安裝”。
          4. 等待安裝完成。

          安裝完成后,就可以在項目中使用HtmlAgilityPack了。

          二、HtmlAgilityPack的使用

          1. 加載HTML文本

          使用HtmlAgilityPack解析HTML文本的第一步是將HTML文本加載到一個HtmlDocument對象中。可以通過以下代碼來實現:

          HtmlDocument doc = new HtmlDocument();
          doc.LoadHtml(htmlText);
          

          其中,htmlText是要解析的HTML文本。LoadHtml方法會將HTML文本解析成一個DOM文檔對象,并存儲在doc對象中。

          1. 獲取DOM節點

          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語法相同。在這里不再詳細介紹。

          1. 修改DOM節點

          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");
          
          1. 生成HTML文本

          HtmlAgilityPack還可以將DOM文檔對象轉換為HTML文本。可以通過以下代碼來實現:

          string newHtmlText = doc.DocumentNode.OuterHtml;
          

          其中,OuterHtml屬性返回DOM文檔對象的HTML文本表示。

          三、HtmlAgilityPack的功能實例

          下面將通過一些具體的實例來演示HtmlAgilityPack的使用方法。

          1. 獲取頁面標題

          以下代碼演示了如何獲取頁面標題:

          HtmlDocument doc = new HtmlDocument();
          doc.LoadHtml(htmlText);
          
          HtmlNode titleNode = doc.DocumentNode.SelectSingleNode("//title");
          string title = titleNode.InnerHtml;
          

          其中,htmlText是要解析的HTML文本。首先,將HTML文本加載到一個HtmlDocument對象中。然后,通過XPath表達式“//title”獲取頁面標題節點。最后,通過InnerHtml屬性獲取標題的內容。

          1. 獲取頁面中的所有圖片

          以下代碼演示了如何獲取頁面中的所有圖片:

          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屬性。

          1. 獲取頁面中的所有鏈接

          以下代碼演示了如何獲取頁面中的所有鏈接:

          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屬性。

          1. 修改頁面中的所有鏈接

          以下代碼演示了如何將頁面中的所有鏈接修改為指定的鏈接:

          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進行數據分析流程包含數據整理與清洗、數據分析與建模、數據可視化與制表等階段。

          • 靈活的分組功能:(group by)數據分組、聚合、轉換數據;
          • 直觀地合并功能:(merge)數據連接;
          • 靈活地重塑功能:(reshape)數據重塑;

          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的地理圖表功能,空間上直觀顯示數據可視化效果。

          更多實用的數據分析知識,關注我,持續創作數據分析內容~


          主站蜘蛛池模板: 一区二区三区AV高清免费波多| 日韩一区精品视频一区二区| 国产内射999视频一区| 国产在线无码视频一区| 国产福利一区二区精品秒拍| 一级毛片完整版免费播放一区| 久久久久国产一区二区| 3d动漫精品啪啪一区二区免费| 精品国产一区二区三区免费看| 一区二区三区视频在线播放| 蜜桃视频一区二区三区在线观看 | 中文字幕精品一区二区日本| 97se色综合一区二区二区| 精品国产亚洲一区二区三区在线观看 | 日本精品一区二区三区四区| 国产精品视频一区二区噜噜 | 99在线精品一区二区三区| 成人无码AV一区二区| 国产一区二区三区日韩精品| 亚洲一区影音先锋色资源| 一区二区三区在线观看视频 | 99精品国产高清一区二区| 国产天堂一区二区综合| 日韩伦理一区二区| 久久蜜桃精品一区二区三区| 无码人妻精品一区二区三区蜜桃 | 毛片一区二区三区| 亚洲一区二区三区高清在线观看| 高清一区二区三区日本久| 国产精品日本一区二区不卡视频 | 一区二区三区在线观看免费| 日韩精品一区二区三区影院| 精品人体无码一区二区三区 | 一区二区三区伦理高清| 无码人妻AⅤ一区二区三区水密桃| 色综合一区二区三区| 亚洲无线码在线一区观看| 日本内射精品一区二区视频| 国模私拍福利一区二区| 国产一区二区精品久久岳√| 亚洲av片一区二区三区|