# 一种在xml文档中导航和选择元素查询语言
# 教程 http://www.w3school.com.cn/xpath/xpath_syntax.asp
# lxml 一种python的xpath解析库
# 安装 pip install lxml
# 最常用的语法
# nodename 选取此节点的所有子节点。
# / 从根节点选取。
# // 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
# . 选取当前节点。
# .. 选取当前节点的父节点。
# @ 选取属性。
text='''
<?xml version="1.0" encoding="ISO-8859-1"?>
<bookstore>
<book>
<title lang="eng">Harry Potter</title>
<price>29.99</price>
</book>
<book>
<title lang="eng" lang2="eng">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
'''
from lxml import etree
root=etree.HTML(text) # 会加上html和body
root.xpath("//.")
# 选择bookstore节点
# 从根节点出发
root.xpath('/html/body/bookstore')
# 从bookstore节点出发
root.xpath("//bookstore")
# 获取book标签 从bookstore节点出发
root.xpath("//bookstore/book")
# 获取标签的属性
root.xpath("//book/title/@lang")
root.xpath("//title/@lang")
# 通过text()获取文本信息
root.xpath("//bookstore/book/title/text()")
# 获取一个标签下的title中的文本信息
root.xpath("//bookstore/book[1]/title/text()") # book[last()] 最后一个 book[last()-1] 倒数第二个
root.xpath("//title[@lang='eng']/text()") # 获取title中lang属性=eng的标签的文本内容
# 多属性条件筛选 or and
root.xpath("//title[@lang='eng' and @lang2='eng']/text()") # 获取title中lang属性=eng 且 lang2=eng 标签的文本内容
image.png
image.png
image.png
image.png
例子
# 例子
import requests
from lxml import etree
# 获取xml数据
url="https://search.51job.com/list/010000,000000,0000,00,9,99,Java%2520%25E5%25BC%2580%25E5%258F%2591,2,1.html"
res=requests.get(url)
res.encoding='gbk'
# 装载内容为xpath
root=etree.HTML(res.text)
# 利用xpath提取网页信息
# 获取职位名称
position=root.xpath("//p[contains(@class,'t1')]/span/a/@title") # 这里表示class中含有t1就可以
print(position)
print(len(position))
# 去除字符串两边的空格和换行符
position=root.xpath("//p[contains(@class,'t1')]/span/a/text()") # 这里表示class中含有t1就可以
for i in range(len(position)):
position[i]=position[i].strip() # strip去除两边 lstrip去除左边 rstrip去除右边
print(position)
print(len(position))
# 公司处理
company=root.xpath("//span[@class='t2']/a/@title")
print(company)
print(len(company))
# 地点
addrs=root.xpath("//div[@class='el']/span[@class='t3']/text()")
print(addrs)
print(len(addrs))
# 工资
salary=root.xpath("//div[@class='el']/span[@class='t4']/text()")
print(salary)
print(len(salary))
# 形成表格
from pandas import DataFrame
jobinfo=DataFrame([position,company,addrs,salary]).T
jobinfo.columns=["职位名","公司名","地点","工资"]
jobinfo
image.png
image.png
image.png
image.png
网友评论