爬蟲(六):XPath、lxml模塊

1. XPath

1.1 什麼是XPath

XPath(XML Path Language) 是一門在XML和HTML文檔中查找信息的語言,可用來在XML和HTML文檔中對元素和屬性進行遍歷。html

1.2 XPath開發工具

1.2.1 Chrome插件XPath Helper

https://jingyan.baidu.com/article/1e5468f94694ac484861b77d.html函數

1.2.2 Firefox插件XPath Checker

https://blog.csdn.net/menofgod/article/details/75646443工具

1.3 Xpath語法

這個就要看我寫的selenium基礎中的文章了。性能

http://www.javashuo.com/article/p-bjbzauue-h.html學習

2. lxml模塊

lxml是一個HTML/XML的解析庫,主要功能是如何解析和提取HTML/XML數據。開發工具

lxml和正則是同樣,也是用C語言實現的,是一款高性能的Python HTML/XML解析器,能夠利用以前學習的XPath語法,來快速定位特定元素以及節點信息。ui

可經過 pip 安裝:spa

pip install lxml -i http://pypi.douban.com/simple/ --trusted-host pypi.douban.com.net

2.1 基本使用

咱們能夠利用它來解析HTML 代碼,且在解析 HTML 代碼的時候,若是 HTML 代碼不規範,他會自動進行補全。插件

from lxml.html import etree

htmlText = '''
<div>
    <ul>
        <li class="item-0"><a href="link1.html">first item</a></li> 
        <li class="item-1"><a href="link2.html">second item</a></li>
        <li class="item-inactive"><a href="link3.html">third item</a></li> 
        <li class="item-1"><a href="link4.html">fourth item</a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li> 
    </ul>
</div>
'''

# 利用 etree.HTML,將字符串解析爲 HTML 文檔
html = etree.HTML(htmlText)

# 按字符串序列化 HTML 文檔
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8')

print(result)

2.2 在文件中讀取html代碼

除了直接使用字符串進行解析,lxml 還支持從文件中讀取內容。

html代碼:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="utf-8">
    <title></title>

</head>
<body>
    <div>
    <ul>
        <li class="item-0"><a href="link1.html">first item</a></li>
        <li class="item-1"><a href="link2.html">second item</a></li>
        <li class="item-inactive"><a href="link3.html">third item</a></li>
        <li class="item-1"><a href="link4.html">fourth item</a></li>
        <li class="item-0"><a href="link5.html">fifth item</a></li>
    </ul>
</div>
</body>
</html>

而後利用etree.parse()方法來讀取文件。

from lxml.html import etree

html = etree.parse('./hello.html')
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8')
print(result)

結果:

 

咱們看到竟然報錯了,爲何呢? 

之因此使用etree.parse()方法解析 html 內容時,會報lxml.etree.XMLSyntaxError的錯,是由於etree.parse()默認使用的是XML的解析器,因此當html內容不規範,好比出現某個標籤缺乏閉合標籤時,就會報這個錯誤。這時,可以使用etree.HTMLParser()建立一個HTML的解析器,而後做爲etree.parse()方法的參數便可。

from lxml.html import etree

htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser)
result = etree.tostring(html, encoding='utf-8', pretty_print=True).decode('utf-8')
print(result)

2.3 在lxml中使用XPath語法

使用XPath語法,應該使用Element.xpath語法,來執行XPath的選擇。

xpath函數返回的永遠是一個列表。

咱們先來匹配下li標籤和a標籤

from lxml.html import etree

htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser)

lis = html.xpath('//li')
for li in lis:
    print(etree.tostring(li, encoding='utf-8', pretty_print=True).decode('utf-8'), end='')

aList = html.xpath('//a/@href')
for a in aList:
    print(a)

 

得到li標籤下a標籤的href屬性和內容:

from lxml.html import etree

htmlParser = etree.HTMLParser(encoding='utf-8')
html = etree.parse('./hello.html', parser=htmlParser)

lis = html.xpath('//li')
for li in lis:
    # . 號表示在當前的 li 元素下去匹配
    href = li.xpath('.//a/@href')[0]   #獲取 a 標籤的 href 屬性
    txt = li.xpath('.//a/text()')[0]   #獲取 a 標籤的文本
    print(href, txt)

相關文章
相關標籤/搜索