Python-XPath

本文最后更新于:9 个月前

XPath是一门在 XML 文档中查找信息的语言

Python-XPath

1、什么是xpath

XPath 使用路径表达式在 XML 文档中进行导航
XPath 包含一个标准函数库
XPath 是 XSLT 中的主要元素
XPath 是一个 W3C 标准

其实XPath就是一门在 XML 文档中查找信息的语言。XPath用于在 XML 文档中通过元素和属性进行导航。

2、安装

pip install lxml

3、xpath语法

3.1、选取节点

XPath使用路径表达式在XML文档种选取节点。

节点包括元素,属性,和内容

html ---> <html> ...</html>

div ---> <div> ...</div>

a  ---> <a> ...</a>

这里的元素和html中的标签一个意思。单独的元素是无法表达一个路径的,所以单独的元素不能独立使用

节点是通过沿着路径或者step来选取的

/   根节点,节点分隔符,

//  任意位置

.   当前节点

..  父级节点

@   属性

谓语

//a[n] n为大于零的整数,代表子元素排在第n个位置的<a>元素

//a[last()]   last()  代表子元素排在最后个位置的<a>元素

//a[last()-]  和上面同理,代表倒数第二个

//a[position()<3] 位置序号小于3,也就是前两个,这里我们可以看出xpath中的序列是从1开始

//a[@href]    拥有href的<a>元素

//a[@href='www.baidu.com']    href属性值为'www.baidu.com'的<a>元素

//book[@price>2]   price值大于2的<book>元素

etree.HTML(html)

from lxml import etree # 报红忽略

url=...
html=requests.get(html).decode('utf-8')
etree.HTML(html)

xpath 函数

text()

输出文本

string()

string()会把当前节点和所有的子孙节点中的文本全部提取出来,组合成一个字符串

code3 = code2.xpath('string(//div[@class="con"])')
# 将类名为con的div中的所有文本提取

https://www.w3school.com.cn/xpath/xpath_functions.asp

示例

<ul class="zxxx_list">

    <li>  <a href="7c34a65595744227bdae8a35d68de133.shtml" target="_blank" title='截至9月13日24时'  >截至9月13日24时</a><span class="ml">2022-09-14</span></li>
</ul>

#!/usr/bin/python
# coding=utf-8
from lxml import html
from lxml import etree
import requests

url=''

a = requests.session()          # session建立连接
html1 = a.get(url).content.decode('utf-8')
print(html1)

html2=etree.HTML(html1,parser = etree.HTMLParser(encoding='utf8'))

print(html2.xpath('//ul[@class="zxxx_list"]/li/a/@href')[0])
# 查找类名为zxxx_list的ul 向下查找li/a 获取a的href 获取第一项

===>

7c34a65595744227bdae8a35d68de133.shtml

参考:
https://www.cnblogs.com/mxjhaima/p/13775844.html

语法参考:
https://blog.csdn.net/qq_50854790/article/details/123610184


完整代码

#!/usr/bin/python
# coding=utf-8
from lxml import etree
import requests

url = 'http://www.nhc.gov.cn'
url1 = 'http://www.nhc.gov.cn/xcs/yqtb/list_gzbd.shtml'

# region 一、访问目标界面,获取动态更新网址

a = requests.session()  # session建立连接
html0 = a.get(url1)
html0.encoding = 'utf-8'

html1 = html0.content.decode('utf-8')
# print(html1)

html2 = etree.HTML(html1, parser=etree.HTMLParser(encoding='utf8'))
html3 = html2.xpath('//ul[@class="zxxx_list"]/li/a/@href')[0]
# print(html3)
a.close()

url2 = url + html3
print(url2)

# endregion

# region 二、从动态网页上获取所需信息
b = requests.session()
res1 = b.get(url2)
res1.encoding = 'utf-8'

code1 = res1.text
print(code1)

b.close()

code2 = etree.HTML(code1, parser=etree.HTMLParser(encoding='utf8'))
code3 = code2.xpath('string(//div[@class="con"])')
# print(code3)

# endregion

# region 三、处理数据

s1 = code3.find('。') + 1
s2 = code3.find('死亡')

code4 = code3[s1:s2]  # 处理数据,找到第一段
print(code4)

str = code4

dict = {'北京': 0, '天津': 0, '上海': 0, '重庆': 0, '河北': 0, '山西': 0, '辽宁': 0, '吉林': 0, '江苏': 0, '浙江': 0,
    '安徽': 0, '福建': 0, '江西': 0, '山东': 0, '河南': 0, '湖北': 0, '湖南': 0, '广东': 0, '海南': 0, '四川': 0,
    '贵州': 0, '云南': 0, '陕西': 0, '甘肃': 0, '青海': 0, '台湾': 0, '广西': 0, '西藏': 0, '宁夏': 0, '新疆': 0,
    '香港': 0, '澳门': 0, '黑龙江': 0, '内蒙古': 0}

sum = str.count('(')  # 处理数据
print(sum)

str1 = ''

for i in range(0, sum):
    num1 = str.find('(')
    num2 = str.find(')')
    str1 = str1 + str[num1 + 1:num2].replace('例', '')
    if i < sum - 1:
        str1 = str1 + ','
    str = str[num2 + 1:]

# print(str1)

str2 = str1.split(',')

# print(str2)

for i in str2:
    for key in dict:
        if key in i and (i.replace(key, '')).isnumeric():
            dict[key] = dict[key] + int(i.replace(key, ''))

print(dict)

# endregion

# region 四、同步数据库

import pymssql

connect = pymssql.connect(host='x.x.x.x:xxxx', user='team16', password='team16', database='team16')  # 远程链接数据库建立连接

if connect:
    print("连接成功")
else:
    print("wrong!")

cursor = connect.cursor()  # 创建一个游标对象python里的sql语句都要通过cursor来执行
sql = "select * from dbo.C19_State;update dbo.C19_State set sum=0 where 1=1;"  # 查询数据库信息
cursor.execute(sql)  # 执行sql语句
row1 = cursor.fetchone()  # 读取查询结果
sql1 = ''
while row1:  # 循环读取所有结果
    for key in dict:
        if key in row1[3]:
            sql1 = sql1 + 'update dbo.C19_State set sum={} where areaName=\'{}\''.format(dict[key], row1[3]) + ';'
    # print(row1[0], row1[1], row1[2], row1[3], row1[4])  # 输出结果
    row1 = cursor.fetchone()

print(sql1)
cursor.execute(sql1)
connect.commit()


sql = "select * from dbo.C19_State;"  # 查询数据库信息
cursor.execute(sql)

row2 = cursor.fetchone()  # 读取查询结果
while row2:  # 循环读取所有结果
    print(row2[0], row2[1], row2[2], row2[3], row2[4],row2[5])  # 输出结果
    row2 = cursor.fetchone()

connect.close()

# endregion

if sum:
    print('同步成功')
else:
       print('同步失败')

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!