python-xpath解析基本用法


常用便捷高效

原理:

1.實例化一個etree的對象,且需要將被解析的頁面源碼數據加載到該對象中。

2調用etree對象中的xpath方法結合着xpath表達式實現標簽的定位和內容的捕獲

環境安裝:

--pip install lxml

--如何實例化一個etree對象

--1.將本地的html文檔的源碼數據加載到etree的對象中:

  etree.parse(filepath)

--2.將從互聯網上獲取源碼數據加載到該對象中

  etree.HTML('page_text')

--xpath('xpath表達式')

    -/:表示從根節點開始定位。表示的是一個層級

    -//:表示多個層級。可以表示從任意位置開始定位

    -屬性定位://div[@class='song'] tag[@attrName='attrValue']

    -索引定位://div[@class='song']/p[3] (表示:所有div下class='song'屬性下的p標簽下第3個標簽(索引是從1開始))

    -取文本:

      -/text()獲取的是標簽中直系的文本內容

      -//text()標簽中非直系的文本內容(所有的文本內容)

    -取屬性:

                      /@attrName   

#解析本地html文件源碼
#根據層級進行定位
from  lxml import etree

#lxml.etree.XMLSyntaxError: StartTag: invalid element name, line 2, column 2
#html代碼書寫不規范,不符合xml解析器的使用規范
'''
解決的辦法:
使用parse方法的parser參數:
parser = etree.HTMLParser(encoding=“utf-8”)
selector = etree.parse(’./data/lol_1.html’,parser=parser)
result=etree.tostring(selector)
print(result)

'''

#實例化etree對象

parser=etree.HTMLParser()
tree=etree.parse('大學排名.html',parser=parser)
r=tree.xpath('/html/head/title')
print(r)  #[<Element title at 0x1f82e18ec40>]

#/表示從根節點開始定位,一個斜杠表示一個層級,
n=tree.xpath('/html/body/div')
print(n)  #[<Element div at 0x1e3cc13ebc0>]

#// 兩個斜杠表示多個層級
a=tree.xpath('/html//div')
print(a)
b=tree.xpath('//div')
print(b) #[<Element div at 0x1f8786cbd80>, <Element div at 0x1f8786cbe00>, <Element div at 0x1f8786cbc40>, <Element div at 0x1f8786cbe40>,...]

#屬性模式
#//標簽名[@class='']
c=tree.xpath('/html/body//div[@class="header shadow"]')
c=tree.xpath('//div[@class="header shadow"]')
print(c)
#索引定位
#//div[@class='']/p[3]索引從1開始表示第三個p標簽


#獲取標簽中的文本內容 亂碼需要編碼解碼
#/text();//text()
d=tree.xpath('//title/text()')
print(d)  #['Èí¿Æ-¸ßµÈ½ÌÓýÆÀ¼ÛÁìÏÈÆ·ÅÆ']
print(d[0].encode('ISO-8859-1').decode('gbk')) #軟科-高等教育評價領先品牌
d=tree.xpath('//td/text()')


#如需獲取標簽下的屬性中的標簽內的text
#tree.xpath('/html/body/div[@class='header..']/p/text()')


#for i,s in enumerate(d):
    #print(d[i].encode('ISO-8859-1').decode('gbk'),end='\t') #通過for循環打印出td下所有text()的內容


#獲取標簽中的屬性值
e=tree.xpath('/html/body/div/@id')#取得div下id=屬性對應的值
print(e)

#如何從子標簽進行xpath獲取
#for i in d:
# i.xpath('./tr/td[1]')這里的'.'表示當前i標簽,沒有i則默認是從html開始的根目錄標簽,會報錯

實例:

獲取html頁面中的title內容

1.查看代碼需要獲取的內容:

 

 

2.分析:

可以發現需要的內容在url class ="house-list-wrap"下的li標簽下的第二個div標簽下的a標簽里

而li標簽並不單一,因此需要先遍歷出所有li標簽,在li標簽下在進行獲取

3.實現:

(1)由於是本地加載會有編碼上的問題,因此需要在parse中傳入一個parser參數

parser=etree.HTMLParser(encoding='utf-8')
tree= etree.parse('58.html',parser=parser)
get_list=tree.xpath('//ul[@class="house-list-wrap"]/li')

(2)這里'/li'為了定位到所有'li'標簽需要加上,這樣返回了一個包含所有li的標簽列表,(記住加了哪個標簽最終定位到哪個標簽,並返回該標簽的列表)

[<Element li at 0x2106ef5bec0>, <Element li at 0x2106ef5be40>, <Element li at 0x2106f620680>, <Element li ....]  

(3)對get_list中的li標簽再進行xpath解析

li標簽下的第二個div下的h2/a標簽的text()

 

 

'.'表示當前li標簽開始定位,若無'.'則會從根目錄開始

#這里'/li'為了定位到所有'li'標簽需要加上,這樣返回了一個包含所有li的標簽列表
print(get_list)
for i in get_list:
    title=i.xpath('./div[2]/h2/a/text()')[0]
    print(title)

返回所有title內容

 

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM