xpath的使用

安装lxml库

pip --default-timeout=100  install lxml -i http://pypi.douban.com/simple --trusted-host pypi.douban.com

requests和xpath的使用

from lxml import etree 
import requests

headers = {'User-Agent' : 'Mozilla/5.0 (Linux; Android 4.2.1; en-us; Nexus 4 Build/JOP40D) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Mobile Safari/535.19'}

response = requests.get("http://www.baidu.com",headers=headers)
text = response.text

# 将文本标签树对象来使用xpath方法。
selector = etree.HTML(text)

# 获取所有div的内容
t = selector.xpath('//div//text()')
print(t)

xpath选择符号

# 基本符号和方法(未匹配到节点时返回空 [] )

// #可以跨层匹配(相对节点)
selector.xpath('//div//li') 

/  #单层路径(绝对节点)
selector.xpath('//div/ul/li') 

/text() #返回当前节点下的文本内容,内容中有标签会被标签分割为多个字段
selector.xpath('//ul[@id="useful"]/text()') 

//text() #返回当前节点下及子节点的所有文本内容
selector.xpath('//ul[@id="useful"]//text()') 

/@属性名  #返回当前节点对应属性的信息
link = selector.xpath('//a/@href')

//div | //p  #返回两个符合两个规则的信息
selector.xpath('//a/text() | //p/text()') 

.  #表示当前节点
selector.xpath('./li') 

.. #表示当前节点的父节点
selector.xpath('//a[text()="极客学院"]/../@id') 

* #表示任意节点 和node()相同
selector.xpath('//div[@id="content"]/*/*/text()') 

@* #表示含属性
selector.xpath('//li[@*]/text()') 

.// #表示当前目录下的所有标签
selector.xpath('//ul')[0].xpath('.//text()')

//li[1] #返回每一区块匹配的第一个li,从1开始数。
selector.xpath('//li[1]//text()')

//div/@class #返回div的class属性的内容
selector.xpath('//div/@class')

//div[not(@class='c1')]  #返回不包含class='c1'的div
selector.xpath('//div[not(@class="c1")]//text()')

//div[not(@class='c1' and @class='number') ]  #返回不包含class='c1' 和 class='head'的div
selector.xpath('//div[not(@class="c1" and @class="number")]//text()')

//div[@calss='c1' or @calss='c2']  #返回@calss='c1' 或者 @calss='c2' 的div
selector.xpath('//div[@class="c1" or @class="c2"]//text()')

//div[last()]  #返回最后一个div
selector.xpath('//div[last()]/text()')

//div[last()-1] #返回倒数第二个div
selector.xpath('//div[last()-1]/text()')

//div[price>"5"]  #返回price属性值大于"5"的
selector.xpath('//div[@price>"5"]/@price')

//div[text()="50"]  #返回div的内容为'50'的标签
selector.xpath('//div[text()="50"]/@class')

//ul[contains(@id,"num")] #div的ID包含字符'num'的标签
selector.xpath('//div[contains(@class,"num")]/@class')

//ul[starts-with(@id,"ur")] #div的ID开始字符'ur'的标签
selector.xpath('//div[starts-with(@id,"ur")]/@id')

//a/parent::div[@id="url"] #父节点 上一层的div
selector.xpath('//a/parent::div[@id="url"]//text()')

//b/ancestor::*/@id  #祖先节点 上一层到多层
selector.xpath('//b/ancestor::*/@id') 

//b/ancestor-or-self::*/@id  #当前和上一层到多层
selector.xpath('//b/ancestor-or-self::*/@id') 

count(//div[@id="url"])  #统计符号条件的标签个数
selector.xpath('count(//div[@id="url"])')

number(//div[@class="num"]/text())  #将第一个匹配的字符转换为float类型
selector.xpath('number(//div[@class="num"]/text())') 

normalize-space(//a[@title="极客学院课程库"]//text()) #去除前后空格和回车
selector.xpath('normalize-space(//a[@title="极客学院课程库"]//text())') 

sum(//div[@class="num"]/text()) #对匹配的字符求和
selector.xpath('sum(//div[@class="num"]/text())') 

标签转换

from lxml import etree
html = ''
with open('./webPage.txt','r',encoding='utf-8') as f:
    html = f.read()

selector = etree.HTML(html)
# 将标签对象还原回字符串
divhtml = etree.tostring(selector.xpath('//li')[0],pretty_print='True').decode('utf-8')
print(divhtml)
#提取节点包含的所有text
content = selector.xpath('//ul[@id="useful"]//text()') 
#只取包含文字的信息
print([i for i in content if len(i.strip())>0 ]) 
原文地址:https://www.cnblogs.com/studyNotesSL/p/11417157.html