【零基础入门Python爬虫】第二节 Python 爬虫解析 Xpath、JsonPath 和 BeautifulSoup

news/2024/11/29 18:44:03/

网络爬虫是一种自动化程序,用于从互联网上获取信息。在网络爬虫中,数据的解析是一个非常重要的环节。Python 是一门流行的编程语言,具有优秀的网络爬虫库,如 Scrapy、BeautifulSoup、Requests 等。本文将着重介绍 Python 中的三种解析技术:Xpath、JsonPath 和 BeautifulSoup。


一、Xpath

XPath 是一种类 XML 的语言,可以用来选择 XML 或 HTML 文档中的节点。在 Python 编程中,我们可以使用 lxml 库来解析 HTML 或 XML 文件,并使用 XPath 语法选择需要的节点。

1.安装

  • 使用 pip 安装:
pip install lxml

2.解析 HTML

我们可以使用 html.etree.ElementTree 模块中的 HTML 方法加载 HTML 文件,然后使用 xpath() 方法获取需要的节点。

from lxml import etreehtml = '''
<!DOCTYPE html>
<html><head><title>Test</title></head><body><ul><li><a href="http://www.baidu.com">Google</a></li><li><a href="http://www.qq.com">Yahoo</a></li></ul></body>
</html>
'''tree = etree.HTML(html)
links = tree.xpath('//ul/li/a')for link in links:print(link.attrib['href'])

输出结果:

http://www.baidu.com
http://www.qq.com

3.解析 XML

如果需要解析 XML 文件,我们可以使用 etree.parse() 方法加载 XML 文件,然后使用 xpath() 方法选择需要的节点。

from lxml import etreexml = '''
<bookstore><book category="cooking"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="children"><title lang="en">Harry Potter</title><author>J.K. Rowling</author><year>2005</year><price>29.99</price></book>
</bookstore>
'''tree = etree.fromstring(xml)
books = tree.xpath('//book')for book in books:print(book.xpath('./title/text()')[0], book.xpath('./price/text()')[0])

输出结果:

Everyday Italian 30.00
Harry Potter 29.99

二、JsonPath

JsonPath 是一种用于在 JSON 对象中定位元素的语言。与 XPath 类似,JsonPath 提供了一些简单的表达式来选择 JSON 对象中的元素。Python 中可以使用 jsonpath_rw 库来实现 JsonPath 的解析。

1.安装

  • 使用 pip 安装:
pip install jsonpath-rw

2.解析 JSON

我们可以使用 json.loads() 方法将 JSON 字符串转换为 Python 对象,然后使用 jsonpath_rw.parse() 方法构造 JsonPath 表达式,并使用 find() 方法获取需要的元素。

import json
from jsonpath_rw import parsejson_str = '''
{"store": {"book": [{"category": "reference","author": "Nigel Rees","title": "Sayings of the Century","price": 8.95},{"category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99}],"bicycle": {"color": "red","price": 19.95}}
}
'''data = json.loads(json_str)
books = parse('$.store.book[*]').find(data)for book in books:print(book.value['title'], book.value['price'])

输出结果:

Sayings of the Century 8.95
Sword of Honour 12.99

 

三、BeautifulSoup

BeautifulSoup 是 Python 中的一个 HTML/XML 解析库,可以从 HTML 或 XML 中提取信息。它可以自动将不规范的 HTML 或 XML 文件转换为规范化的树形结构,并提供了一些简单的方法来查询和修改这个树形结构。

1.安装

  • 使用 pip 安装:
pip install beautifulsoup4

2.解析 HTML

我们可以使用 bs4 模块中的 BeautifulSoup 类来解析 HTML 文件,然后使用 select() 方法获取需要的节点。

from bs4 import BeautifulSouphtml = '''
<!DOCTYPE html>
<html><head><title>Test</title></head><body><ul><li><a href="http://www.baidu.com">Google</a></li><li><a href="http://www.qq.com">Yahoo</a></li></ul></body>
</html>
'''soup = BeautifulSoup(html, 'html.parser')
links = soup.select('ul li a')for link in links:print(link['href'])

输出结果:

http://www.baidu.com
http://www.qq.com

3.解析 XML

如果需要解析 XML 文件,我们可以使用 lxml 库来解析 XML 文件,并将解析结果传递给 BeautifulSoup 类。

from lxml import etree
from bs4 import BeautifulSoupxml = '''
<bookstore><book category="cooking"><title lang="en">Everyday Italian</title><author>Giada De Laurentiis</author><year>2005</year><price>30.00</price></book><book category="children"><title lang="en">Harry Potter</title><author>J.K. Rowling</author><year>2005</year><price>29.99</price></book>
</bookstore>
'''tree = etree.fromstring(xml)
soup = BeautifulSoup(etree.tostring(tree), 'xml')
books = soup.select('book')for book in books:print(book.select_one('title').text, book.select_one('price').text)

 输出结果:

Everyday Italian 30.00
Harry Potter 29.99

总结

本文介绍了 Python 中三种常用的解析技术:Xpath、JsonPath 和 BeautifulSoup。使用这些技术,我们可以方便地从 HTML、XML 或 JSON 文件中提取所需的信息。在实际开发中,我们可以根据具体情况选择适合自己的解析技术,并根据需求灵活运用各种工具和技术来提高数据解析效率。


http://www.ppmy.cn/news/58445.html

相关文章

cadence遇到的问题

1、最烦人的&#xff0c;突然卡住。 设置grid卡住&#xff0c;导出libraries卡住&#xff0c;选择其他产品时卡住。 从微软拼音输入法改成美式键盘后能解决一些问题。但不能解决全部。 今天下载了搜狗输入法来替代微软自带输入法。效果奇佳&#xff0c;真的可以诶。 2、如果…

openstack GPU

参考链接 添加虚拟GPU到实例 Nova的虚拟GPU特性可以实现使用能够提供虚拟GPU的物理GPU部署指定类型的GPU到实例。 比如单独的Intel GVT-g或者NVIDIA GRID vGPU物理图形处理器单元都可以被虚拟化成多个虚拟vGPUs&#xff0c;前提是hypervisor支持硬件的驱动以及有足够的容量来…

vim常用命令总结

vim常用命令总结 &#xff08;转) 在命令状态下对当前行用 &#xff08;连按两次&#xff09;, 或对多行用n&#xff08;n是自然数&#xff09;表示自动缩进从当前行起的下面n行。你可以试试把代码缩进任意打乱再用n排版&#xff0c;相当于一般IDE里的code format。使用ggG可对…

Linux:《tar》归档命令

准备好4个文件然后使用tar命令进行归档 最常用的是 -c, --create&#xff08;小写&#xff09; 建立新的存档 -f, --file [HOSTNAME:]F 指定存档或设备 (缺省为 /dev/rmt0) -z, --gzip, --ungzip 用 gzip 对存档压缩或解压 -j&…

Java 基础进阶篇(三)—— 面向对象的三大特征之二:继承

文章目录 一、继承概述二、内存运行原理 ★三、继承的特点四、继承后&#xff1a;成员变量和方法的访问特点五、继承后&#xff1a;方法重写六、继承后&#xff1a;子类构造器的特点七、继承后&#xff1a;子类构造器访问父类有参构造器八、this、super 总结 一、继承概述 Jav…

windows的命令行

命令行就是文本交互界面&#xff0c;通过命令行可以使用一个一个的指令来操作计算机 任何的计算机的操作系统中都包含有命令行&#xff08;windows、linux、macOS&#xff09; 命令行有多个不同的名字&#xff1a; 命令行、命令行窗口、DOS窗口、命令提示符、CMD窗口、Shell、终…

【LeetCode】64. 最小路径和

64. 最小路径和&#xff08;中等&#xff09; 方法一&#xff1a;常规动态规划 思路 定义一个二维 dp 数组&#xff0c;其中 dp[i][j]表示从左上角开始到&#xff08;i, j&#xff09;位置的最优路径的数字和。因为每次都只能向下或者向右移动&#xff0c;所以很容易发现 dp数组…

Tkinter正则表达式工具

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入tkinter和re模块&#x1f3f3;️‍&#x1f308; 2. 设置窗口居中&#x1f3f3;️‍&#x1f308; 3. 设置lable、text、button布局&#x1f3f3;️‍&#x1f308; 4. 设置下拉列表框&#x1f3f3;️‍&#x1f308; 5. 清空文…