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']