Python实战使用XPath采集数据示例解析
作者:极客飞虎 发布时间:2022-02-25 09:00:24
lxml
lxml 是 Python 的一个库,用于解析和呈现 XML 和 HTML。它支持多种内置和第三方 XML 和 HTML 标记,例如 <a>
,<img>
,<form>
,<ul>
,<li>
,<ol>
,<dl>
,<dt>
,<dd>
等。lxml 还支持使用正则表达式来解析和呈现 XML 和 HTML。
本文我们就介绍lxml的使用方法,我们使用lxml获取我们想要的数据。
发送请求
首先,我们要进行数据来源分析,知道我们的需求是什么?
明确需求:
明确采集网站是什么?
明确采集数据是什么?
我们都玩过4399小游戏,我们想获取游戏名称和游戏链接,并保存下来。首先,我们导入相关的库文件。
import csv
import requests
from lxml import etree
接下来,我们可以发送请求,获取网页源代码,代码如下。
url = 'https://www.4399.com/flash_fl/2_1.htm'
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36'
}
res = requests.get(url, headers=headers)
res.encoding = res.apparent_encoding
这段代码是一个 Python 的 requests
模块的示例代码,用于从 https://www.4399.com/flash_fl/2_1.htm
这个网站上获取数据并将其转换为 HTML 格式。
首先,我们定义了一个 url
变量,它包含了要从网站上获取数据的 URL。然后,我们使用 headers
字典来设置请求头,包括 user-agent
头部,用于指定浏览器的 User-Agent 信息。
接下来,我们使用 requests.get()
函数来发送一个 HTTP GET 请求,并将 headers
字典作为请求头传递给它。这个函数会返回一个 Response
对象,我们可以使用 res.encoding
属性来获取请求的编码方式,并将其设置为 res.apparent_encoding
,以便在输出 HTML 时使用相同的编码方式。
最后,我们将请求的编码方式设置为浏览器的默认编码方式,以便在输出 HTML 时使用相同的编码方式。
解析数据
接下来,我们用xpath解析数据。我们用开发者工具定位到标签位置。
html_data = etree.HTML(res.text)
lis = html_data.xpath('//*[@class="bre m15"]//ul/li')
for li in lis:
href = li.xpath('./a/@href')[0]
title = li.xpath('./a/img/@alt')[0]
接下来,我们使用 html_data.xpath
方法来解析 HTML 文档中的 ul
和 li
元素,并将它们存储在 lis
变量中。
最后,我们使用 for
循环遍历 lis
,并使用 li.xpath
方法来获取每个 li
元素的 a
元素的 href
和 alt
属性,并将它们存储在 href
和 title
变量中。 我们运行结果之后,我们还要对链接进行拼接。
保存数据
接下来就是保存数据,先写入头文件。
f = open('4399小游戏.csv', mode='a', encoding='utf-8', newline='')
csv_writer = csv.DictWriter(f, fieldnames=['游戏名称', '游戏网站'])
csv_writer.writeheader()
这段代码中,我们首先使用 Python 的 open()
函数打开了一个名为 "4399小游戏.csv" 的文件,文件模式为 a
,表示追加模式。
然后,我们使用 Python 的 csv
模块创建了一个名为 csv_writer
的 DictWriter
对象,并使用 writeheader()
方法来写入表头。
最后,我们使用 write()
方法向文件中写入数据,数据内容为一个字典对象。
这段代码的作用是将一个字典对象写入到文件中,其中包含了游戏名称和游戏网站两个字段的数据。
需要注意的是,在写入数据之前,我们需要使用 csv.DictWriter()
函数来创建一个 DictWriter
对象,并使用 fieldnames
参数来指定字段名称。此外,我们还需要使用 newline=''
参数来避免在 Windows 系统中出现换行符问题。 '''
dit = {
'游戏名称': title,
'游戏网站': data_url,
}
csv_writer.writerow(dit)
'''
来源:https://juejin.cn/post/7220782242254798907


猜你喜欢
- Vue-router是伴随着Vue框架出现的路由系统,它也是公认的一种优秀的路由解决方案。在使用Vue-router时候,我们常常会使用其自
- 一、桌面应用软件桌面应用软件是基于GUI(Graphical User Interface,图形用户界面)交互式程序,需要实现GUI库实现前
- 设置Table的细边框通常有这么几种方式:1、设置边框的BORDER=0 、cellspacing=1,设置Table的背景色为所要的边框色
- 最近接触到微服务框架go-zero,翻看了整个框架代码,发现结构清晰、代码简洁,所以决定阅读源码学习下,本次阅读的源码位于core/sync
- 相信大家对python-docx这个常用的操作docx文档的库都不陌生,它支持以内联形状(Inline Shape)的形式插入图片,即图片和
- 引言这两天遭遇了手机号登录相关的压测需求,算是比较棘手的。主要原因有两个,第一:之前从来没有接手过这个项目,不熟悉各种规则;第二:数据量偏大
- 通常我们写tab选项卡的时候,一般都是用jq等去操作dom,给同级元素移除active类,然后,给被点击元素添加active类,但是在vue
- 大家在打开带有图片的网页时,有时会看到这样的情况:当鼠标指向图片的不同部位时,可以打开不同的超链接,这
- 终端输出彩色文字开发工具:Mac,Goland,Mac自带shell。这是基于Mac的测试结果,根据读者留言,在Windows上不生效,标识
- 一、首先要确保你的电脑上opencv的环境和visual studio上的环境都配置好了,测试的时候通过了没有问题。二、那么只要在你项目里面
- 前期准备qrcode下载地址:qrcode · PyPIQR Code image generatorhttps://pypi.org/pr
- Python 中要创建对象列表:声明一个新变量并将其初始化为一个空列表。使用 for 循环迭代范围对象。实例化一个类以在每次迭代时创建一个对
- 作为一门脚本语言,写脚本时执行系统命令可以说很常见了,python提供了相关的模块和方法。os模块提供了访问操作系统服务的功能,由于涉及到操
- 数字序号① ①② ②③ &
- 因客户需求,要把数据库里的索引编号做成五位长度的,且能自动累加编号,我只会在SQL中使用Identity自动编号:Create Table
- 对象的创建模式Object 构造函数模式:先创建空对象,再动态添加属性和方法。适用场景:初始时对象内部数据不确定。存在问题:语句太多(这个问
- Aptana IDE现在已经被重命名为Aptana Studio,这款IDE的背后有着风险投资的支持,旨在给Web开发者
- 使用keras进行训练,默认使用单显卡,即使设置了os.environ['CUDA_VISIBLE_DEVICES']为两张
- AJAX简介AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。AJA
- 适用的日志格式:106.45.185.214 - - [06/Aug/2014:07:38:59 +0800] "GET / HT