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

相关文章
|
12天前
|
数据采集 弹性计算 Kubernetes
单机扛不住,我把爬虫搬上了 Kubernetes:弹性伸缩与成本优化的实战
本文讲述了作者在大规模爬虫项目中遇到的挑战,包括任务堆积、高失败率和成本失控。通过将爬虫项目迁移到Kubernetes并使用HPA自动伸缩、代理池隔离和Redis队列,作者成功解决了这些问题,提高了性能,降低了成本,并实现了系统的弹性伸缩。最终,作者通过这次改造学到了性能、代理隔离和成本控制的重要性。
单机扛不住,我把爬虫搬上了 Kubernetes:弹性伸缩与成本优化的实战
|
2月前
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
2月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
169 0
|
15天前
|
数据采集 Web App开发 机器学习/深度学习
Selenium爬虫部署七大常见错误及修复方案:从踩坑到避坑的实战指南
本文揭秘Selenium爬虫常见“翻车”原因,涵盖浏览器闪退、元素定位失败、版本冲突、验证码识别等七大高频问题,结合实战案例与解决方案,助你打造稳定高效的自动化爬虫系统,实现从“能用”到“好用”的跨越。
307 0
|
2月前
|
数据采集 存储 Rust
Rust爬虫实战:用reqwest+select打造高效网页抓取工具
在数据驱动时代,本文详解如何用Rust构建高效稳定爬虫系统。基于reqwest与select库,以books.toscrape.com为例,演示HTTP请求、HTML解析、分页抓取及数据存储全流程,涵盖同步与异步实现、反爬应对及性能优化,助你掌握Rust爬虫开发核心技能。
79 2
|
2月前
|
数据采集 存储 Web App开发
Python爬虫库性能与选型实战指南:从需求到落地的全链路解析
本文深入解析Python爬虫库的性能与选型策略,涵盖需求分析、技术评估与实战案例,助你构建高效稳定的数据采集系统。
259 0
|
2月前
|
数据采集 存储 XML
Python爬虫XPath实战:电商商品ID的精准抓取策略
Python爬虫XPath实战:电商商品ID的精准抓取策略
|
3月前
|
数据采集 存储 监控
Python爬虫实战:批量下载亚马逊商品图片
Python爬虫实战:批量下载亚马逊商品图片
|
3月前
|
数据采集 监控 网络协议
基于aiohttp的高并发爬虫实战:从原理到代码的完整指南
在数据驱动时代,传统同步爬虫效率低下,而基于Python的aiohttp库可构建高并发异步爬虫。本文通过实战案例解析aiohttp的核心组件与优化策略,包括信号量控制、连接池复用、异常处理等,并探讨代理集成、分布式架构及反爬应对方案,助你打造高性能、稳定可靠的网络爬虫系统。
191 0
|
5月前
|
数据采集 消息中间件 Kubernetes
Kubernetes上的爬虫排队术——任务调度与弹性扩缩容实战
本教程介绍如何在 Kubernetes 上构建可扩展的爬虫系统,解决传统单机爬虫瓶颈。核心内容包括:使用 Docker 打包爬虫任务、RabbitMQ 实现任务队列、爬虫代理防限制、随机 User-Agent 模拟请求,以及通过 Horizontal Pod Autoscaler (HPA) 实现根据任务压力自动扩缩容。适合需要处理大规模网页采集的开发者学习与实践。
Kubernetes上的爬虫排队术——任务调度与弹性扩缩容实战

推荐镜像

更多