Spider05

1. Xpath解析

1.1 XPth

XPth:是一门在XML文档中查找内容的语言。

XML文档:存储和传输数据的。 --> json数据。

1.2 json和XML区别

1)json数据对机器友好型语言。

2)XML对人类友好型语言。

1.3 XPath根据什么在XML查找内容

1)XML文档中有很多节点。例如:根节点(文档节点)、属性节点、内容节点、元素节点等。

2)xml文档是树形结构。

xml_str = """
<supermarket> --> 根节点(文档节点)
    <name>永辉超市</name>  --> 元素节点
    <address>中国</address> --> 中国,内容节点
    <address name="one">四川成都</address>
    <address name="two">肖家河大厦</address>
    <goodsList>
        <goods name="泡面" price="3.5" count="20"></goods>  -->name="泡面",属性节点
        <goods name="矿泉水" price="2" count="50"></goods>
        <goods name="面包" price="5" count="15"></goods>
    </goodsList>
    <worker_list>
        <cashier name="张三" pay="4000"></cashier>
        <shoppingGuide name="李四" pay="3500"></shoppingGuide>
    </worker_list>
    <goods price="50" count="15">
         <name>烟</name>
    </goods>
</supermarket>
"""

2. XPath语法

2.1 etree.HTML(字符串类型HTML页面源代码)

etree.HTML(字符串类型HTML页面源代码):将HTML页面源码转换成_Element类型。

2.2 etree.XML(字符串类型的XML源码)

etree.XML(字符串类型的XML源码):将XML文档源码转换成_Element类型。

# 1. 页面源代码转换类型
root = etree.XML(xml_str)
print(root, type(root))
# <Element supermarket at 0x1bbf089fec0> <class 'lxml.etree._Element'>

2.3 XPth路径选择器语法

XPth语法:
1) . :表示当前节点
2) … :表示当前节点的父节点
3) / :表示的是当前文档的根节点
4) // :表示的是当前节点的任意位置节点
5) text():获取节点中的内容
6) @ :获取节点中的属性值

2.4 XPth提取页面信息

1)supermarket - 获取文档中名字叫做supermarket子节点

print(root.xpath('supermarket'))    # []

2)/supermarket - 获取文档根节点supermarket

print(root.xpath('/supermarket'))    # [<Element supermarket at 0x1bbf089fec0>]

3)//name - 获取当前节点下的任意name节点

print(root.xpath('//name'))    # [<Element name at 0x1d85ca8f340>, <Element name at 0x1d85ca8f300>]

4)//name/text() - 获取当前节点下的任意name节点中的内容

print(root.xpath('//name/text()'))    # ['永辉超市', '烟']

5)/supermarket/goodsList/goods - 获取supermarket根节点下goodsList字节点的goods子节点

print(root.xpath('/supermarket/goodsList/goods'))    # [<Element goods at 0x16a45caf3c0>, <Element goods at 0x16a45caf400>, <Element goods at 0x16a45caf380>]

6)/supermarket/goodsList/goods/@name

print(root.xpath('/supermarket/goodsList/goods/@name'))    # ['泡面', '矿泉水', '面包']

7).

goods_list = root.xpath('/supermarket/goodsList/goods')
print(goods_list)
for i in goods_list:
    print(i.xpath('./@name'))

8)… - 获取当前文档中任意位置的cashier节点的父节点

print(root.xpath('//cashier/..'))    # [<Element worker_list at 0x1ddcd99f540>]

2.5 谓语

谓语 - 给xpath路径选择器添加精确条件。

1)/supermarket/goodsList/goods[1]/@name - 获取supermarket根节点下goodsList子节点的第一个goods节点的name属性值

print(root.xpath('/supermarket/goodsList/goods[1]/@name'))    # ['泡面']

2)/supermarket/goodsList/goods[1]/@name - 获取supermarket根节点下goodsList子节点的最后一个goods节点的name属性值

print(root.xpath('/supermarket/goodsList/goods[last()]/@name'))    # ['面包']

3)/supermarket/goodsList/goods[1]/@name - 获取supermarket根节点下goodsList子节点的倒数第二个goods节点的name属性值

print(root.xpath('/supermarket/goodsList/goods[last()-1]/@name'))    # ['矿泉水']

4)//goods[@name] - 获取当前节点中带有name属性的goods

print(root.xpath('//goods[@name]'))    # [<Element goods at 0x25357fa0380>, <Element goods at 0x25357fa02c0>, <Element goods at 0x25357fa0240>]

5)//goods[@name] - 获取当前节点中带有name属性是矿泉水的goods

print(root.xpath('//goods[@name="矿泉水"]'))    # [<Element goods at 0x25357fa02c0>]
```sql select * from ods.ods_cms_exchange_rate_df where spider_date >= '2025-06-01' and spider_date <= '2025-06-31' limit 10; ``` 输出 ``` src_db id spider_date spider_time publication_time currency exchange_rate time_inst time_upd dt cms.exchange_rate 153 2025-06-01 2025-06-01 10:09:50.0 2025-05-30 09:25:30.0 CNY 2.6910 2025-05-31 20:09:51.0 2025-05-31 20:09:51.0 20250706 cms.exchange_rate 154 2025-06-01 2025-06-01 10:09:50.0 2025-05-30 09:25:30.0 USD 19.3343 2025-05-31 20:09:51.0 2025-05-31 20:09:51.0 20250706 cms.exchange_rate 155 2025-06-02 2025-06-02 10:05:53.0 2025-05-30 09:25:30.0 CNY 2.6910 2025-06-01 20:05:53.0 2025-06-01 20:05:53.0 20250706 cms.exchange_rate 156 2025-06-02 2025-06-02 10:05:53.0 2025-05-30 09:25:30.0 USD 19.3343 2025-06-01 20:05:54.0 2025-06-01 20:05:54.0 20250706 cms.exchange_rate 157 2025-06-03 2025-06-03 10:00:42.0 2025-06-03 09:25:20.0 CNY 2.6758 2025-06-02 20:00:42.0 2025-06-02 20:00:42.0 20250706 cms.exchange_rate 158 2025-06-03 2025-06-03 10:00:42.0 2025-06-03 09:25:20.0 USD 19.2307 2025-06-02 20:00:43.0 2025-06-02 20:00:43.0 20250706 cms.exchange_rate 159 2025-06-04 2025-06-04 10:05:45.0 2025-06-04 09:25:27.0 CNY 2.6748 2025-06-03 20:05:45.0 2025-06-03 20:05:45.0 20250706 cms.exchange_rate 160 2025-06-04 2025-06-04 10:05:45.0 2025-06-04 09:25:27.0 USD 19.2281 2025-06-03 20:05:46.0 2025-06-03 20:05:46.0 20250706 cms.exchange_rate 161 2025-06-05 2025-06-05 10:00:49.0 2025-06-05 09:25:45.0 CNY 2.6735 2025-06-04 20:00:50.0 2025-06-04 20:00:50.0 20250706 cms.exchange_rate 162 2025-06-05 2025-06-05 10:00:49.0 2025-06-05 09:25:45.0 USD 19.2131 2025-06-04 20:00:50.0 2025-06-04 20:00:50.0 20250706 ``` 请问如何得到每个日期下USD和CNY的汇率?
最新发布
07-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值