python爬虫实战实现XPath和lxml | python爬虫实战之六

简介: 本节介绍了用XPath类似于路径的设计遍历或者查询其中的某些元素或者元素的属性。

Python实现urllib3和requests库使用 | python爬虫实战之五

HTML解析

通过上面的库, 都可以拿到HTML内容。

HTML的内容返回给浏览器, 浏览器就会解析它, 并对它渲染。

HTML超文本表示语言, 设计的初衷就是为了超越普通文本, 让文本表现力更强。
XML扩展标记语言, 不是为了代替HTML, 而是觉得HTML的设计中包含了过多的格式, 承担了一部分数据之外的任务, 所以才设计了XML只用来描述数据。
HTML和XML都有结构, 使用标记形成树型的嵌套结构。DOM(Document Object Model) 来解析这种嵌套树型结构, 浏览器往往都提供了对DOM操作的API, 可以用面向对象的方式来操作DOM。

XPath

https://www.w3school.com.cn/xpath/index.asp 中文教程
XPath是一门在XML文档中查找信息的语言。XPath可用来在XML文档中对元素和属性进行遍历。

XPath 术语
在 XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。XML 文档是被作为节点树来对待的。树的根被称为文档节点或者根节点。

节点关系
父(Parent):每个元素以及属性都有一个父。
子(Children):元素节点可有零个、一个或多个子。
同胞(Sibling):拥有相同的父的节点。
先辈(Ancestor):某节点的父、父的父,等等。
后代(Descendant):某个节点的子,子的子,等等。

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。节点是通过沿着路径 (path) 或者步 (steps) 来选取的。

工具
XMLQuire win7+需要.NET框架4.0-4.5。
测试XML、XPath

image.png
image.png
image.png

使用工具去测试XML、XPath。

image.png
image.png

在XPath中, 有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档(根)节点。

/根结点
元素节点
Corets, Eva元素节点,
id=”bk 104”是属性节点, id是元素节点book的属性

节点之间的嵌套形成父子(parent、children) 关系
具有同一个父节点的不同节点是兄弟(sibling) 关系
谓语(Predicates)
谓语用来查找某个特定的节点或者包含某个指定的值的节点。
谓语被嵌在方括号中。
谓语就是查询的条件。

image.png

XPath轴(Axes)

image.png

XPATH实例

以斜杠开始的称为绝对路径,表示从根开始。

不以斜杆开始的称为相对路径,一般都是依照当前节点来计算。当前节点在上下文环境中,当前节点很可能已经不是根节点了。

一般为了方便, 往往xml如果层次很深, 都会使用//来查找节点。

image.png
image.png
image.png
image.png
image.png

我们需要对上面这些XPATH实例熟练练习。

lxml

Ixml是Python下功能丰富的XML、HTML解析库, 性能非常好, 是对libxml2和libxslt的封装。最新版支持Python 2.6+, python 3支持到3.6。
官方网站:https://lxml.de/index.html
CentOS编译安装需要

#yum install libxml2-devel libxslt-devel

注意,不同平台不一样,参看http://lxml.de/installation.html

lxml安装

$pip install lxml

那么如何来构建一个HTML呢?

image.png

from lxml import etree


root = etree.Element('html')  
body = etree.Element('body')

root.append(body)


div1 = etree.SubElement(body, 'div')

div2 = etree.SubElement(body, 'div')

print(etree.tostring(root))

执行结果:

image.png

进行一个pretty_print打印

print(etree.tostring(root, pretty_print = True).decode())

image.png

etree还提供了2个有用的函数
etree.HTML(text) 解析HTML文档, 返回根节点
anode.xpath('xpath路径') 对节点使用xpath语法

从豆瓣电影中提取”本周口碑榜”

image.png

我们可以下载插件ChroPath,然后去”本周口碑榜”检查,通过路径查找获取具体内容。当然我们也可以爬虫实现:

from lxml import etree

import requests

urls = ['https://movie.douban.com/']
session = request.session()
with session:
    for url in urls:
        response = session.get(url, headers = {
        'User-agent': "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.75 Safari/537.36"
        })
        
        content = response.text
      #  print(content)
        
        # XPath //div[@class='billboard-bd']//tr//td/a/text()
        html = etree.HTML(content)
        titles = html.xpath("//div[@class='billboard-bd']//tr//td/a/text()")
        for t in titles:
            print(t)

执行结果:

image.png

此时,想要获取到标签以及内容,我们需要修改代码:

        titles = html.xpath("//div[@class='billboard-bd']//tr//text()")

            print('-'*30)

执行结果:

image.png

当然我们也有另外的方式,修改代码:

        titles = html.xpath("//div[@class='billboard-bd']//tr")
        for title in titles:
            txt = title.xpath('.//text()')
            print(''.join(map(lambda x: x.strip(), txt)))
            print('-'*30)

执行结果:

image.png

我们对于XPath的处理不要过于复杂,定位到我们需要的内容,然后之后的处理可以通过Python来进行。

配套视频课程,点击这里查看

获取更多资源请订阅Python学习站

相关文章
|
13小时前
|
数据采集 存储 中间件
Python高效爬虫——scrapy介绍与使用
Scrapy是一个快速且高效的网页抓取框架,用于抓取网站并从中提取结构化数据。它可用于多种用途,从数据挖掘到监控和自动化测试。 相比于自己通过requests等模块开发爬虫,scrapy能极大的提高开发效率,包括且不限于以下原因: 1. 它是一个异步框架,并且能通过配置调节并发量,还可以针对域名或ip进行精准控制 2. 内置了xpath等提取器,方便提取结构化数据 3. 有爬虫中间件和下载中间件,可以轻松地添加、修改或删除请求和响应的处理逻辑,从而增强了框架的可扩展性 4. 通过管道方式存储数据,更加方便快捷的开发各种数据储存方式
|
17小时前
|
数据采集 数据挖掘 数据处理
Python数据分析实战:使用Pandas处理Excel文件
Python数据分析实战:使用Pandas处理Excel文件
5 0
|
18小时前
|
存储 缓存 Python
深入理解Python中的装饰器:原理与实战
深入理解Python中的装饰器:原理与实战
5 0
|
17小时前
|
数据可视化 数据处理 Python
Python数据可视化:Matplotlib库的使用与实战
Python数据可视化:Matplotlib库的使用与实战
5 0
|
1天前
|
数据采集 XML 前端开发
Python爬虫:BeautifulSoup
这篇内容介绍了Python中BeautifulSoup库的安装和使用。首先,通过在命令行输入`pip install bs4`进行安装,或使用清华源加速。接着讲解BeautifulSoup的基本概念,它是一个用于数据解析的工具,便于处理HTML和XML文档。与正则表达式不同,BeautifulSoup提供更方便的方式来查找和操作标签及其属性。 文章详细阐述了BeautifulSoup的两个主要方法:`find`和`find_all`。`find`方法用于查找单个指定标签,可结合属性字典进行精确选择;`find_all`则返回所有匹配标签的列表。通过这些方法,可以方便地遍历和提取网页元素。
7 0
|
1天前
|
数据采集 前端开发 JavaScript
Python爬虫入门
网络爬虫是自动抓取网页数据的程序,通过URL获取网页源代码并用正则表达式提取所需信息。反爬机制是网站为防止爬取数据设置的障碍,而反反爬是对这些机制的对策。`robots.txt`文件规定了网站可爬取的数据。基础爬虫示例使用Python的`urllib.request`模块。HTTP协议涉及请求和响应,包括状态码、头部和主体。`Requests`模块是Python中常用的HTTP库,能方便地进行GET和POST请求。POST请求常用于隐式提交表单数据,适用于需要发送复杂数据的情况。
9 1
|
1天前
|
搜索推荐 数据可视化 Python
Python应用实战,用动画生成冒泡排序的过程
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
|
4天前
|
机器学习/深度学习 网络协议 数据库
Python编程实战:解决常见编程问题
```markdown Python编程入门指南:涵盖文件操作、列表操作、字符串处理、函数编写、异常处理、网络编程和数据库操作等实战案例。通过示例代码,学习如何读写文件、排序列表、转换字符串、创建函数、处理异常、构建TCP服务器及操作SQLite数据库,逐步掌握Python核心技能。 ```
|
4天前
|
应用服务中间件 数据库 nginx
Python Web开发实战:从搭建博客到部署上线
使用Python和Flask初学者指南:从搭建简单博客到部署上线。文章详细介绍了如何从零开始创建一个博客系统,包括准备Python环境、使用Flask和SQLite构建应用、设计数据库模型、创建视图函数和HTML模板,以及整合所有组件。最后,简述了如何通过Gunicorn和Nginx将应用部署到Linux服务器。
|
6天前
|
机器学习/深度学习 算法 数据挖掘
4小时学完!15年技术大牛用247个实战案例剖析的Python教程
今天给小伙伴们分享一份15年技术大牛用247个实战案例剖析的Python教程,这份教程全程彩图讲解,告别枯燥!60秒学会⼀个⼩例⼦,带你系统学习Python,从⼊门到⼤师。 涵盖了Python基础、Python字符串和正则、Python⽂件和⽇期、Python三⼤利器、Python绘图、Python之坑、Python第三⽅包、机器学习和深度学必知算法、Python实战、Pandas数据分析案例实战十大篇幅的精品案例教程