1. 程式人生 > 其它 >xpath 和 在 lxml 中應用 (做個小筆記)

xpath 和 在 lxml 中應用 (做個小筆記)

技術標籤:python爬蟲

#xpath
#xpath(XML Path Language)是一門在XML和HTML文件中查詢資訊的語言,可用來在XML和HTML文件中對元素和屬性進行遍歷。
#1.用法

'''
 /                        代表逐層提取                例項   提取標題                             /html/head/title
 text()                   提取標籤下的文字             例項   提取標題文字                         /html/head/title/text()
 //標籤名                  提取所有名為**的標籤          例項   提取所有div標籤                     //div
 //標籤名[@屬性=‘屬性值’]    提取屬性名為**的標籤          例項 提取div中<div class="tools">標籤內容      //div[@class="tools"]/text()
 @屬性名                   代表某個屬性名               例項  提取新_我的訂單  //ul[@class="ddnewhead_gcard_list"]/li/a/@dd-name

'''
''' 路徑用法 謂語 /li/a[1] 即選取屬於 li 標籤下 第一個 a元素 /li/a[last()] 即選取屬於 li 標籤下 最後一個 a元素 /li/a[last()-1] 即選取屬於 li 標籤下 倒數第二個 a元素 /li/a[position()<3] 即選取屬於 li 標籤下 前兩個 a元素 /li/a[price>35.00] 即選取屬於 li 標籤下 a元素中pprice大於的元素 ''' ''' 萬用字元 * 匹配任意節點 @* 匹配任意節點中的任何屬性 | 選取多個路徑 /li/a | /li/a/text() 選取所有 a元素 和 a元素下的文字資訊 '''
#2.lxml lxml 是 一個HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 資料。 from lxml import html text = ''' <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> </ul> </div> '''
# 將字串解析為html文件 txt =html.etree.HTML(text) print(txt) #type 為 <class 'lxml.etree._Element'> # 按字串序列化html tostring result = html.tostring(txt).decode('utf-8') print(result) #type 為 str '''#從檔案中提取 txt=html.etree.parse('檔名') result=html.etree.tostring(txt).decode('utf-8') print(result)'''
# xpath 在 lxml 中應用
from lxml import html
text='''
<html><body><p>html
<!-- hello.html -->
</p><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"><span class="bold">third item</span></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>
'''
#txt=html.etree.HTML(text)
#result=html.etree.tostring(txt).decode('utf-8')
#print(result)

txt=html.etree.HTML(text)
#1. 獲取所有li標籤:       這個可以不重要理解吧 好像一般都用不了
result=txt.xpath('//ul/li')
'''這裡的的txt必須是html 的 格式 才能用xpath提取        得到的是一個列表'''
''''  得到的像這樣   <Element li at 0x2d414722188> 是一個元素,它的型別是'lxml.etree._Element'  需要用 html.tostring()  取出內容
    因為這個標籤下有很多內容  所以返回的是這個   如果路徑具體的話就不會是這個 而是具體的內容  '''
for i in range(0,len(result)):
    realresult = html.tostring(result[i]).decode('utf-8')
    print(realresult)

#2. 獲取所有li元素下的所有class屬性的值:
result=txt.xpath('//ul/li/@class')
print(result)
#3. 獲取li標籤下href為link2.html的a標籤:
result=txt.xpath('//ul/li[2]/a/@href')   #也可以  '//ul/li[@class="item-1"][1]/a/@href'
print(result)
#4. 獲取li標籤下所有span標籤:
result=txt.xpath('//ul/li/a/span')
print(result)
#5. 獲取li標籤下的a標籤裡的所有class:
result=txt.xpath('//ul/li/a//@class')
print(result)
#6. 獲取最後一個li的a的href屬性對應的值:
result=txt.xpath('//ul/li[last()]/a/@href')
print(result)
# 7. 獲取倒數第二個li元素的內容:
result=txt.xpath('//ul/li[last()-1]/a')
print(result[0].text)                         #因為得到的 列表 所以 第一個元素 即為所求
#8. 獲取倒數第二個li元素的內容的第二種方式:
result=txt.xpath('//ul/li[last()-1]/a/text()')
print(result)