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学习站

相关文章
|
11天前
|
数据采集 存储 API
网络爬虫与数据采集:使用Python自动化获取网页数据
【4月更文挑战第12天】本文介绍了Python网络爬虫的基础知识,包括网络爬虫概念(请求网页、解析、存储数据和处理异常)和Python常用的爬虫库requests(发送HTTP请求)与BeautifulSoup(解析HTML)。通过基本流程示例展示了如何导入库、发送请求、解析网页、提取数据、存储数据及处理异常。还提到了Python爬虫的实际应用,如获取新闻数据和商品信息。
|
15天前
|
数据采集 Python
【python】爬虫-西安医学院-校长信箱
本文以西安医学院-校长信箱为基础来展示爬虫案例。来介绍python爬虫。
【python】爬虫-西安医学院-校长信箱
|
17天前
|
存储 缓存 JavaScript
python实战篇:利用request库打造自己的翻译接口
python实战篇:利用request库打造自己的翻译接口
29 1
python实战篇:利用request库打造自己的翻译接口
|
2天前
|
API 数据库 数据安全/隐私保护
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】Django REST framework (DRF) 是用于构建Web API的强力工具,尤其适合Django应用。本文深入讨论DRF面试常见问题,包括视图、序列化、路由、权限控制、分页过滤排序及错误处理。同时,强调了易错点如序列化器验证、权限认证配置、API版本管理、性能优化和响应格式统一,并提供实战代码示例。了解这些知识点有助于在Python面试中展现优秀的Web服务开发能力。
19 1
|
1天前
|
数据采集 存储 JSON
Python爬虫面试:requests、BeautifulSoup与Scrapy详解
【4月更文挑战第19天】本文聚焦于Python爬虫面试中的核心库——requests、BeautifulSoup和Scrapy。讲解了它们的常见问题、易错点及应对策略。对于requests,强调了异常处理、代理设置和请求重试;BeautifulSoup部分提到选择器使用、动态内容处理和解析效率优化;而Scrapy则关注项目架构、数据存储和分布式爬虫。通过实例代码,帮助读者深化理解并提升面试表现。
10 0
|
2天前
|
SQL 中间件 API
Flask框架在Python面试中的应用与实战
【4月更文挑战第18天】**Flask是Python的轻量级Web框架,以其简洁API和强大扩展性受欢迎。本文深入探讨了面试中关于Flask的常见问题,包括路由、Jinja2模板、数据库操作、中间件和错误处理。同时,提到了易错点,如路由冲突、模板安全、SQL注入,以及请求上下文管理。通过实例代码展示了如何创建和管理数据库、使用表单以及处理请求。掌握这些知识将有助于在面试中展现Flask技能。**
11 1
Flask框架在Python面试中的应用与实战
|
4天前
|
SQL 关系型数据库 MySQL
Python与MySQL数据库交互:面试实战
【4月更文挑战第16天】本文介绍了Python与MySQL交互的面试重点,包括使用`mysql-connector-python`或`pymysql`连接数据库、执行SQL查询、异常处理、防止SQL注入、事务管理和ORM框架。易错点包括忘记关闭连接、忽视异常处理、硬编码SQL、忽略事务及过度依赖低效查询。通过理解这些问题和提供策略,可提升面试表现。
25 6
|
4天前
|
数据采集 JavaScript 前端开发
使用Python打造爬虫程序之破茧而出:Python爬虫遭遇反爬虫机制及应对策略
【4月更文挑战第19天】本文探讨了Python爬虫应对反爬虫机制的策略。常见的反爬虫机制包括User-Agent检测、IP限制、动态加载内容、验证码验证和Cookie跟踪。应对策略包括设置合理User-Agent、使用代理IP、处理动态加载内容、验证码识别及维护Cookie。此外,还提到高级策略如降低请求频率、模拟人类行为、分布式爬虫和学习网站规则。开发者需不断学习新策略,同时遵守规则和法律法规,确保爬虫的稳定性和合法性。
|
7天前
|
API 调度 开发者
深入理解Python异步编程:从Asyncio到实战应用
在现代软件开发中,异步编程技术已成为提升应用性能和响应速度的关键策略。本文将通过实例讲解Python中的异步编程核心库Asyncio的基本概念、关键功能以及其在Web开发中的应用。我们不仅将理论与实践结合,还将展示如何通过实际代码示例解决常见的并发问题,帮助开发者更有效地利用Python进行异步编程。
|
10天前
|
SQL API 数据库
Python中的SQLAlchemy框架:深度解析与实战应用
【4月更文挑战第13天】在Python的众多ORM(对象关系映射)框架中,SQLAlchemy以其功能强大、灵活性和易扩展性脱颖而出,成为许多开发者首选的数据库操作工具。本文将深入探讨SQLAlchemy的核心概念、功能特点以及实战应用,帮助读者更好地理解和使用这一框架。