1. 程式人生 > >Python爬蟲資料提取方式——使用xpath提取頁面資料

Python爬蟲資料提取方式——使用xpath提取頁面資料

xpath:跟re,bs4,pyquery一樣,都是頁面資料提取方法。

                xpath是根據元素的路徑來查詢頁面元素

安裝lxml包:pip install lxml

HTML例項:

html = """
    <div id='content'>
        <ul class='list'>
            <li class='one'>One</li>
            <li class='two'>Two</li>
            <li class='three'>Three</li>
            <li class='four four1 four2 four3'>Four</li>
            <div id='inner'>
                <a href='http://www.baidu.com'>百度一下</a>
                <p>第一段</p>
                <p>第2段</p>
                <p>第3段</p>
                <p>
                    第4段
                    <span>法大師傅大師傅</span>
                </p>
                <p>第5段</p>
                <p>第6段</p>
            </div>
        </ul>
    </div>
"""

將一個Html檔案解析成為物件:

首先匯入:

# element tree: 文件樹物件
from lxml.html import etree

將HTML解析成為物件:

#方式一:使用較多
obj= etree.HTML("index.html")

#方式二:
obj = etree.parse('index.html')

print(type(obj))

開始查詢元素或資料:

注意:

1、 //ul: 從obj中查詢ul,不考慮ul所在的位置。
2、/li: 找到ul下邊的直接子元素li,不包含後代元素。
3、 [@class="one"]: 給標籤設定屬性,用於過濾和篩選

4、xpath()返回的是一個列表:比如

one_li = obj.xpath('//ul/li[@class="one"]')[0]


獲取one_li的文字內容:

one_li = obj.xpath('//ul/li[@class="one"]')[0]
print(one_li.xpath('text()')[0])

# 上述寫法的合寫方式
print(obj.xpath('//ul/li[@class="one"]/text()')[0])
 獲取所有li的文字內容:
all_li = obj.xpath('//ul/li/text()')

獲取所有li的文字內容以及class屬性的值:

all_li = obj.xpath('//ul/li')
for li in all_li:
    class_value = li.xpath('@class')[0]
    text_value = li.xpath('text()')[0]
    print(class_value, text_value)

獲取div標籤內部的所有文字:

注意://text():獲取所有後代元素的文字內容
           /text():獲取直接子元素的文字,不包含後代元素

print(obj.xpath('//div[@id="inner"]//text()'))
獲取ul中第一個li  [1]([1]:第一個li)的文字:
print(obj.xpath('//ul/li[1]/text()'))
查詢類名中包含four的li的文字內容:
print(obj.xpath('//ul/li[contains(@class, "four")]/text()'))