1. 程式人生 > >python爬微信公眾號前10篇歷史文章(3)-lxml&xpath初探

python爬微信公眾號前10篇歷史文章(3)-lxml&xpath初探

操作 其他 正則 串操作 容器 pan 對象 tail 創建

  • 理解lxml以及xpath

什麽是lxml?

python中用來處理XML和HTML的library。與其他相比,它能提供很好的性能, 並且它支持XPath。 具體可以查看官方文檔->http://lxml.de/index.html

  • 結構化數據:

XML, JSON

  • 非結構化數據:

HTML文本是最常見的數據格式,因為一般我們需要的關鍵信息並非直接可以得到,需要進行對HTML的解析查找,甚至一些字符串操作才能得到,所以歸類於非結構化的數據處理中。

常見解析方式如下: XPath、CSS選擇器、正則表達式

python lxml庫可以使用elements來創建XML/HTML結構, 也可以從XML/HTML結構中解析出想要的信息。

創建HTML結構

1. 導包, etree用來創建元素和結構

from lxml import etree

2. 使用 Element class API 來創建多個元素。元素也被稱作結點。

root = etree.Element(html)

3.XML/HTML結構遵循父親-兒子範例,一個結點可以是其他結點的父親或者兒子。在lxml中要創建這種關系可以使用etree模塊下的SubElement。

In [5]: etree.SubElement(root, head)
Out[5]: <Element head at 0x7f43a5c51e60>
 
In [6]: etree.SubElement(root, 
body) Out[6]: <Element body at 0x7f43a5c51f38> In [7]: print etree.tostring(root) <html><head/><body/></html>

4 每個結點有很多屬性

解析HTML結構

1 使用 lxml 的 etree 庫,然後利用 etree.HTML解析

In [19]: import requests
In [20]: from lxml import etree
In [21]: page = requests.get(http://www.cnn.com
) In [22]: html_content = etree.html(page.text)

當我們獲得一個etree結構時,接下來需要用到XPath去定位信息。 它有特定的表達式去選擇結點或者一組特定結點。

XPath

XPath(XML Path Language)是XML路徑語言,它是一種用來定位XML文檔中某部分位置的語言。

表達式描述
/ 從根節點選取。
nodename 選取此節點的所有子節點。
// 從當前節點 選擇 所有匹配文檔中的節點
. 選取當前節點。
.. 選取當前節點的父節點。
@ 選取屬性。
  • 每個結點類型是一種靈活的容器對象,用於在內存中存儲結構化數據。

    每個結點對象都具有以下屬性:

  1. tag:string對象,標簽,用於標識該元素表示哪種數據(即元素類型)。

  2. attrib:dictionary對象,表示附有的屬性。

  3. text:string對象,表示element的內容。

  4. tail:string對象,表示element閉合之後的尾跡。

<tag attrib1=1>text</tag>tail
1     2        3         4

謂語條件(Predicates)

  1. 謂語用來查找某個特定的信息或者包含某個指定的值的節點。

  2. 所謂"謂語條件",就是對路徑表達式的附加條件

  3. 謂語是被嵌在方括號中,都寫在方括號"[]"中,表示對節點進行進一步的篩選。

 

python爬微信公眾號前10篇歷史文章(3)-lxml&xpath初探