天天看點

Xpath解析

xpath解析

  • html标簽結構
    • 是一個樹狀的結構
  • xpath解析原理
    • 執行個體化一個etree對象,且将即将被解析的資料加載到該對象中
      • 解析本地存儲的html文檔:
        • etree.parse('fileName')
      • 解析網上爬取的html資料:
        • etree.HTML(page_text)
    • 使用etree對象中的xpath方法結合着不同的xpath表達式實作标簽定位和資料提取

xpath表達式

  • 标簽定位
    • 最左側的/:必須要從根标簽開始逐層的定位目标标簽
    • 非最最側的/:表示一個層級
    • 最左側的//:可以從任意位置定義目标标簽
    • 非最左側的//:表示多個層級
    • 屬性定位://tagName[@attrName='value']
    • 索引定位://tagName[index],index索引是從1開始
    • 模糊比對:
      • //div[contains(@class, "ng")] 定位到class屬性值中包含ng的div标簽
      • //div[starts-with(@class, "ta")] 定位到class屬性值中是以ta開頭的div标簽
  • 資料提取
    • 取标簽中的資料
      • /text():直系文本内容
      • //text():所有的文本内容
    • 取屬性的資料
      • tagName/@attrName
from lxml import etree           

In [35]:

tree = etree.parse('./test.html')#将本地存儲的html文檔進行解析
tree           

Out[35]:

<lxml.etree._ElementTree at 0x10af51508>           

In [38]:

tree.xpath('/html/head')#從根标簽開始定位head标簽
tree.xpath('//head') #将html文檔中所有的head标簽定位到           

Out[38]:

[]           

In [40]:

tree.xpath('/html//meta')           

Out[40]:

[<Element meta at 0x10d9d2e88>]           

In [43]:

#定位class為song的div标簽
tree.xpath('//div[@class="song"]')           

Out[43]:

[<Element div at 0x10d9cca88>]           

In [49]:

tree.xpath('//li[1]')           

Out[49]:

[<Element li at 0x10dcb8708>]           

In [52]:

tree.xpath('//a[@id="feng"]/text()')           

Out[52]:

['鳳凰台上鳳凰遊,鳳去台空江自流,吳宮花草埋幽徑,晉代衣冠成古丘']           

In [54]:

tree.xpath('//div[@class="song"]//text()')           

Out[54]:

['\n\t\t',
 '李清照',
 '\n\t\t',
 '王安石',
 '\n\t\t',
 '蘇轼',
 '\n\t\t',
 '柳宗元',
 '\n\t\t',
 '\n\t\t\t',
 'this is span',
 '\n\t\t宋朝是最強大的王朝,不是軍隊的強大,而是經濟很強大,國民都很有錢',
 '\n\t\t',
 '總為浮雲能蔽日,長安不見使人愁',
 '\n\t\t',
 '\n\t']           

In [56]:

tree.xpath('//a[@id="feng"]/@href')           

Out[56]:

['http://www.haha.com']