### Xpath常用规则
## nodename 选取此节点的所有子节点
## / 从当前节点选取直接子节点
## // 从当前节点选取子孙节点
## . 选取当前节点
## .. 选取当前节点的父节点
## @ 选取属性 ### 测试文本
text = '''
<ul id="dmr" name="liebiao">
<li data-closeper="" aria-label="查看更多" role="menuitem" aria-haspopup="true" data-groupid="104" class="J_Cat a-all">
<a data-cid="1" data-dataid="222878" >家电</a>
<a data-cid="1" data-dataid="222908" >数码</a>
<a data-cid="1" data-dataid="222879" >手机 <i aria-hidden="true" class="tb-ifont service-arrow"></i>
</li>
</ul>
'''

1. etree示例引入

## etree示例引入
from lxml import etree # 构造一个etree的HTML节点对象(可供Xpath解析)
html = etree.HTML(text)
# 读取text文本内容进行构造节点对象
html2 = etree.parse('./text', etree.HTMLParser())
# 用tostring方法可以修正html代码,如上面代码缺失的</a>标签
result = etree.tostring(html)
result2 = etree.tostring(html2)
print(html, html2)
print(type(html), type(html2))
'''
输出内容:
<Element html at 0x2b47848> <lxml.etree._ElementTree object at 0x0000000002B47788>
<class 'lxml.etree._Element'> <class 'lxml.etree._ElementTree'>
'''
# 输出修正后的html代码
print(result.decode('utf-8'))
print(result2.decode('utf-8'))

2. 提取页面下的所有节点

## 提取页面下的所有节点
from lxml import etree html = etree.HTML(text)
result = html.xpath('//*')
print(len(result))
print(result) '''
输出结果:
8
[<Element html at 0x2b539c8>, <Element body at 0x2b53948>, <Element ul at 0x2b53a08>, <Element li at 0x2b53a48>, <Element a at 0x2b53a88>, <Element a at 0x2b53b08>, <Element a at 0x2b53b48>, <Element i at 0x2b53b88>]
'''

3. 提取子节点

## 提取子节点
from lxml import etree html = etree.parse('./text', etree.HTMLParser())
# 通过/寻找li标签下的直接a子节点
result = html.xpath('//li/a')
# 通过//寻找ul标签下的a子和孙节点
result2 = html.xpath('//ul//a')
print(len(result), len(result2))
print(result, result2) '''
运行结果:
3 3
[<Element a at 0x2963cc8>, <Element a at 0x2963d08>, <Element a at 0x2963d48>] [<Element a at 0x2963cc8>, <Element a at 0x2963d08>, <Element a at 0x2963d48>]
'''

4. 提取父节点

## 提取父节点
from lxml import etree html = etree.HTML(text)
# 提取li节点中role属性为menuitem的节点的父节点的name属性内容
result = html.xpath('//li[@role="menuitem"]/../@name')
print(result) '''
输出结果:
['liebiao']
'''

5. 属性匹配

## 属性匹配
html = etree.HTML(text)
# 匹配data-dataid为222878的节点
result = html.xpath('//a[@data-dataid="222878"]')
print(result) '''
输出内容:
[<Element a at 0x2973c48>]
'''

6. 提取文本内容

## 提取文本内容
html = etree.HTML(text)
# 匹配data-dataid为222878的节点的文本内容
result = html.xpath('//a[@data-dataid="222878"]/text()')
print(result) '''
输出内容:
['家电']
'''

7. 属性值获取

## 属性获取
from lxml import etree html = etree.HTML(text)
result = html.xpath('//li/@aria-label')
print(result) '''
输出内容:
['查看更多']
'''

8. 属性多值匹配

## 属性多值匹配
from lxml import etree html = etree.HTML(text)
result = html.xpath('//li[@class="J_Cat"]')
result2 = html.xpath('//li[@class="J_Cat a-all"]//text()')
result3 = html.xpath('//li[contains(@class, "J_Cat")]//text()')
print(result, result2, result3) '''
输出结果:
[] ['\n', '家电', '\n', '数码', '\n', '手机\n\n', '\ue62e', '\n'] ['\n', '家电', '\n', '数码', '\n', '手机\n\n', '\ue62e', '\n']
'''

9. 多属性匹配

## 多属性匹配
## 运算符介绍
# or 或
# and 与
# mod 除余
# | 返回节点集合
# + 加法
# - 减法
# * 乘法
# = 等于
# != 不等于
# < 小于
# <= 小于或等于
# > 大于
# >= 大于或等于
from lxml import etree html = etree.HTML(text)
result = html.xpath('//li[contains(@class, "J_Cat") and @role="menuitem"]/a/text()')
print(result) '''
输出结果:
['家电', '数码', '手机\n\n', '\n']
'''

10. 按序选择,通过索引的方式进行选择

## 按序选择,通过索引的方式进行选择
from lxml import etree html = etree.HTML(text)
# 提取li节点下第一个a节点的文本内容
print(html.xpath('//li/a[1]/text()'))
# 提取li节点下最后一个a节点的文本内容
print(html.xpath('//li/a[last()]/text()'))
# 提取li节点下位置小于3的a节点的文本内容
print(html.xpath('//li/a[position()<3]/text()'))
# 提取li节点下倒数第2个a节点的文本内容
print(html.xpath('//li/a[last()-1]/text()')) '''
输出结果:
['手机\n\n', '\n']
['家电', '数码']
['数码']
'''

11. 节点轴选择

## 节点轴选择
# ancestor轴,可以节点获取所有的祖先节点
# attribute轴,可以获取节点的所有属性值
# child轴,可以获取节点的所有直接子节点
# descendant轴,可以获取节点的所有子孙节点
# following轴,可以获取节点后的所有节点
# following-sibling,可以获取当前节点的所有同级节点
from lxml import etree html = etree.HTML(text)
print(html.xpath('//li/a[1]/ancestor::*'))
print(html.xpath('//li/a[1]/ancestor::ul'))
print(html.xpath('//li/a[1]/attribute::*'))
print(html.xpath('//li[1]/child::*'))
print(html.xpath('//ul[1]/descendant::a'))
print(html.xpath('//a[1]/following::*'))
print(html.xpath('//a[1]/following-sibling::*')) '''
输出结果:
[<Element html at 0x2b53b88>, <Element body at 0x2b53b48>, <Element ul at 0x2b53d88>, <Element li at 0x2b53bc8>]
[<Element ul at 0x2b53b48>]
['1', '222878']
[<Element a at 0x2b53b48>, <Element a at 0x2b53d88>, <Element a at 0x2b53bc8>]
[<Element a at 0x2b53b48>, <Element a at 0x2b53d88>, <Element a at 0x2b53bc8>]
[<Element a at 0x2b53b48>, <Element a at 0x2b53d88>, <Element i at 0x2b53bc8>]
[<Element a at 0x2b53d88>, <Element a at 0x2b53bc8>]
'''

12. 用Xpath解析爬取豆瓣top250

### 用Xpath解析爬取豆瓣top250

from lxml import etree
import requests, json def get_page(url):
'''
获取url网页代码
:param url: 要爬取的网址
:return: 网页代码
''' headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36'
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
print('get page success...')
return response.text
else:
exit('get page fail...') def parse_page(text):
'''
解析豆瓣电影top250网页代码
:param html: 网页代码
:return: data需要爬取的数据
''' html = etree.HTML(text)
items = html.xpath('//ol[@class="grid_view"]/li/div[@class="item"]')
for item in items:
#print(item.xpath('.//div[@class="bd"]/p[@class="quote"]/span/text()')[0])
yield {
'img': item.xpath('.//div[@class="pic"]//img/@src')[0],
'details': item.xpath('.//div[@class="hd"]/a/@href')[0],
'name': item.xpath('.//div[@class="hd"]//span[1]/text()')[0],
'director': item.xpath('.//div[@class="bd"]/p[@class=""]/text()')[0].split()[1],
'actor': item.xpath('.//div[@class="bd"]/p[@class=""]/text()')[0].split()[5] if len(item.xpath('.//div[@class="bd"]/p[@class=""]/text()')[0].split())>5 else 'None',
'time': item.xpath('.//div[@class="bd"]/p[@class=""]/text()')[1].split()[0],
'nation': item.xpath('.//div[@class="bd"]/p[@class=""]/text()')[1].split()[2],
'type': item.xpath('.//div[@class="bd"]/p[@class=""]/text()')[1].split()[4:],
'score': item.xpath('.//div[@class="bd"]/div/span[@class="rating_num"]/text()')[0],
'introduction': item.xpath('.//div[@class="bd"]/p[@class="quote"]/span/text()') if item.xpath('.//div[@class="bd"]/p[@class="quote"]/span/text()') else 'None',
} return items def save_to_file(data):
'''
保存爬取到的数据到文本文件中
:param data:
:return:
'''
with open('豆瓣电影top250.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(data, ensure_ascii=False) + '\n') def main(start):
url = 'https://movie.douban.com/top250?start=' + str(start)
text = get_page(url)
data = parse_page(text)
for item in data:
print(item)
save_to_file(item) if __name__ == '__main__':
for i in range(10):
start = i * 25
main(start)

Xpath解析库的使用的更多相关文章

  1. BeautifulSoup与Xpath解析库总结

    一.BeautifulSoup解析库 1.快速开始 html_doc = """ <html><head><title>The Dor ...

  2. 数据的查找和提取[2]——xpath解析库的使用

    xpath解析库的使用 在上一节,我们介绍了正则表达式的使用,但是当我们提取数据的限制条件增多的时候,正则表达式会变的十分的复杂,出一丁点错就提取不出来东西了.但python已经为我们提供了许多用于解 ...

  3. python爬虫三大解析库之XPath解析库通俗易懂详讲

    目录 使用XPath解析库 @(这里写自定义目录标题) 使用XPath解析库 1.简介   XPath(全称XML Path Languang),即XML路径语言,是一种在XML文档中查找信息的语言. ...

  4. 爬虫之xpath解析库

    xpath语法: 1.常用规则:    1.  nodename:  节点名定位    2.  //:  从当前节点选取子孙节点    3.  /:  从当前节点选取直接子节点    4.  node ...

  5. xpath beautiful pyquery三种解析库

    这两天看了一下python常用的三种解析库,写篇随笔,整理一下思路.太菜了,若有错误的地方,欢迎大家随时指正.......(conme on.......) 爬取网页数据一般会经过 获取信息-> ...

  6. Python爬虫3大解析库使用导航

    1. Xpath解析库 2. BeautifulSoup解析库 3. PyQuery解析库

  7. Python 爬虫 解析库的使用 --- XPath

    一.使用XPath XPath ,全称XML Path Language,即XML路径语言,它是一门在XML文档中查找信息的语言.它最初是用来搜寻XML文档的,但是它同样适用于HTML文档的搜索. 所 ...

  8. Python3编写网络爬虫05-基本解析库XPath的使用

    一.XPath 全称 XML Path Language 是一门在XML文档中 查找信息的语言 最初是用来搜寻XML文档的 但是它同样适用于HTML文档的搜索 XPath 的选择功能十分强大,它提供了 ...

  9. (最全)Xpath、Beautiful Soup、Pyquery三种解析库解析html 功能概括

    一.Xpath 解析   xpath:是一种在XMl.html文档中查找信息的语言,利用了lxml库对HTML解析获取数据. Xpath常用规则: nodename :选取此节点的所有子节点 // : ...

随机推荐

  1. 技术博客--微信小程序canvas实现图片编辑

    技术博客--微信小程序canvas实现图片编辑 我们的这个小程序不仅仅是想给用户提供一个保存和查找的平台,还希望能给用户一个展示自己创意的舞台,因此我们实现了图片的编辑部分.我们对对图片的编辑集成了很 ...

  2. OO--第三单元规格化设计 博客作业

    OO--第三单元规格化设计 博客作业 前言 第三单元,我们以JML为基础,先后完成了 PathContainer -> Graph -> RailwaySystem 这是一个递进的过程,代 ...

  3. time_formatter攻防世界学习

    time_formatter 前言:这题说实话分析量蛮大的,首先是程序内壁比较绕,而且调用了之前许多没有见到的函数---如snprintf_che,以及strsup(好像打错了),getegid(), ...

  4. Noip模拟74 2021.10.11

    T1 自然数 考场上当我发现我的做法可能要打线段树的时候,以为自己百分之百是考虑麻烦了 但还是打了,还过掉了所有的样例,于是十分自信的就交了 正解还真是线段树,真就第一题数据结构 但是包括自己造的小样 ...

  5. 热身训练1 Calculator

    题目出处:Calculator 简要题意: 你有一个确定的函数,f(x)=+...*...^...,其中共有n个操作,从左到右依次计算. 共有m次询问,我们每次询问,1.会修改f(x)中的操作:2.输 ...

  6. 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑~帶你一次看懂!

    正文字体大小:大 中 小 為什麼我的手機連Wi-Fi速度總是卡在75Mbps?Wi-Fi速度解惑-帶你一次看懂! (2017-02-21 10:57:48) 转载▼ 标签: wi-fi速度 手機wi- ...

  7. 二叉树中和为某一值的路径 牛客网 程序员面试金典 C++ Python

    二叉树中和为某一值的路径 牛客网 程序员面试金典 题目描述 输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径.路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一 ...

  8. 滑动窗口的最大值 牛客网 剑指Offer

    滑动窗口的最大值 牛客网 剑指Offer 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6 ...

  9. hdu 2190 重建希望小学(数学,递推)

    题意: N*3的教室,有2种砖,2*2.1*1. 问铺设教室的方案有多少种.(要铺满) 思路: 画一下图可以很快发现递推公式 代码: int main(){ int a[35]; mem(a,0); ...

  10. Python——Excel转Json工具

    Python工具Excel转Json 前置条件 1.安装python 下载python 我下载的是2.7: 2.配置环境变量 我的电脑右键--属性--高级系统设置--环境变量: 添加python的安装 ...