爬虫之lxml模块和xpath

2023-11-13

lxml模块

lxml 库是一款 Python 数据解析库,参考重要文档在 lxml - Processing XML and HTML with Python,项目开源地址在:GitHub - lxml/lxml: The lxml XML toolkit for Python

在Python中,为了使用XPath,需要安装一个第三方库:lxml,使用lxml才能从html通过xpath方法读取内容

import lxml.html
selector=lxml.html.fromstring(html2)
content=selector.xpath('//div[contains(@id,"-key")]/text()')

Xpath语法

xpath的核心思想是写地址

获取文本:

 获取属性值

 //开始为绝对路径,从需要提取的内容往上找标签,找到一个拥有“标志性属性值”的标签为止。

<div class="userful">
    <ul>
        <li class="info">我需要的信息1</li>
           <li class="test">我需要的信息2</li>
           <li class="strange">我需要的信息3</li>
    </ul>
</div>

如这段内容,//div[@class='useful']/ul/li/text()就能得到三个文本信息。

以相同字符串开头

如果只需要提取某些属性开头的内容,可用如下方法

//标签[starts-with(@属性名,"相同的开头部分")]

html2="""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
<div id="test1111">需要的内容1</div>
<div id="test2-key">需要的内容2</div>
<div id="asssss">不需要的内容1</div>
</body>
</html>
"""
import lxml.html
selector=lxml.html.fromstring(html2)
content=selector.xpath('//div[starts-with(@id,"test")]/text()')
for each in content:
    print(each)

 

 属性值包含相同字符串

如果提取内容属性值包含相同字符串,可以用contains方法

html2="""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
<div id="abc -key">需要的内容1</div>
<div id="1234 -key">需要的内容2</div>
<div id="asssss">不需要的内容1</div>
</body>
</html>
"""
import lxml.html
selector=lxml.html.fromstring(html2)
content=selector.xpath('//div[contains(@id,"-key")]/text()')
for each in content:
    print(each)

 对XPath返回的对象执行XPath

XPath也支持先抓大再抓小

html2="""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
<div class="userful">
    <ul>
        <li class="info">我需要的信息1</li>
           <li class="test">我需要的信息2</li>
           <li class="strange">我需要的信息3</li>
    </ul>
</div>

<div class="useless">
    <ul>
         <li class="info">垃圾1</li>
           <li class="info">垃圾2</li>
    </ul>

</div>

</body>
</html>
"""
import lxml.html
selector=lxml.html.fromstring(html2)
content=selector.xpath('//div[@class="userful"]/ul/li/text()')
for each in content:
    print(each)

也可以:

html2="""
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>测试</title>
</head>
<body>
<div class="userful">
    <ul>
        <li class="info">我需要的信息1</li>
           <li class="test">我需要的信息2</li>
           <li class="strange">我需要的信息3</li>
    </ul>
</div>

<div class="useless">
    <ul>
         <li class="info">垃圾1</li>
           <li class="info">垃圾2</li>
    </ul>

</div>

</body>
</html>
"""
import lxml.html
selector=lxml.html.fromstring(html2)
useful=selector.xpath('//div[@class="userful"]')#这里返回一个列表
infolist=useful[0].xpath('ul/li/text()')
print(infolist)

 

 同时提取子标签文字

先获取节点,再对节点使用xpath,用string(.)函数提取。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

爬虫之lxml模块和xpath 的相关文章

  • python,在数据框中存储字典

    我构建了一个 pandas 数据框 它在每个单元格中存储一个简单的字典 例如 Sales 0 Revenue 0 我可以通过以下方式从数据帧中检索特定值 df columnA index100 Revenue 但现在我想绘制一个图表 其中包
  • 如何在不访问 hg 的情况下提取 BitBucket 存储库

    我想知道是否可以在不访问 hg 的情况下将私人 Mercurial 存储库拉到服务器上 我有 SSH 访问权限 但无法安装 HG 我正在考虑某种使用 http 访问的 Python 脚本或其他东西 但我不确定 我还认为这可能只有通过公共回购
  • Pandas 用单位插值数据

    大家好 几年来我一直在寻找 Stackoverflow 它对我帮助很大 以至于我以前不需要注册 但今天我遇到了一个使用 Python 与 Pandas 和 Quantities 也可能是 unum 或 pint 的问题 我尽力发表清晰的帖子
  • 如何在Python和C++之间交换数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想用 Python 编写一个程序 读取 2 个数字 从文本文件或用户输入 调用一个接受 2 个参数 这 2 个数字 的 C 函数 将
  • 如何访问命令行参数? [复制]

    这个问题在这里已经有答案了 我使用 python 创建项目设置设置 但我需要帮助获取命令行参数 我在终端上尝试过 python myfile py var1 var2 var3 在我的 Python 文件中 我想使用输入的所有变量 Pyth
  • 将文件上传到S3的模拟测试用例

    我们如何模拟文件上传到 S3 我尝试过这样的事情 file mock mock MagicMock spec File name FileMock mock patch storages backends s3boto S3BotoStor
  • 如果我不重置 Python 的 ContextVars 会发生什么?

    这是Python中的内存泄漏吗 import contextvars contextvar contextvars ContextVar example while True string hello world token context
  • 使用正则表达式的 Strip() 函数

    我正在尝试重新创建strip 使用正则表达式的Python函数 这是最后一个练习题用 Python 自动化处理无聊的事情 https automatetheboringstuff com chapter7 这是我的代码 import re
  • 如何访问数据框中的一行嵌套字典

    我有一个 json 文件 如下所示 file name main question no Q 1 question what is answer user John comment It is defined as value number
  • 在 Mac 上运行 Tkinter

    我是一个绝对的新手 我正在尝试为我的学校项目制作 Python GUI 所以我决定使用 Tkinter 当我尝试导入 Tkinter 时 它会抛出以下消息 gt gt gt import tkinter Traceback most rec
  • 使用 imaplib 库连接到电子邮件时遇到 AUTHENTICATIONFAILED 错误

    如何连接到 imaplib 库而不遇到 AUTHENTICATIONFAILE 错误 通过网络浏览器登录时 我的 Gmail 收件箱显示严重的安全警报 登录尝试被阻止 IMAP SERVER imap gmail com USERNAME
  • 像多米诺骨牌一样对 Python 中的元组进行排序/查找顶点连接

    我有一个像这样的整数元组列表 L 1 2 7 6 2 3 8 5 3 8 5 7 每对定义两个顶点之间的边 我想找到顶点连接性 没有循环 元组总是像多米诺骨牌一样唯一地链接起来 因此在这种情况下 排序列表应如下所示 L sorted 1 2
  • 使用 numpy.distutils.core.setup 之前安装 numpy

    我在用numpy distutils设置具有 fortran 模块的包 mypackage 问题是如果我这样做pip install mypackage在没有 numpy 的环境中 出现以下错误 ModuleNotFoundError 没有
  • 制作一个可以接受各种形状参数的函数

    Q1 Numpy 函数可以采用不同形状的参数 例如 np sum V 可以采用以下两个之一并返回具有不同形状的输出 x1 np array 1 3 1 x2 np array 1 2 3 4 5 6 7 8 2 我正在制作自己的函数 如下所
  • ctypes c_char_p 的不同行为?

    我对不同版本的 python 的这种行为感到困惑 不明白为什么 Python 2 7 5 default Aug 25 2013 00 04 04 GCC 4 2 1 Compatible Apple LLVM 5 0 clang 500
  • 与 CPython、Jython 和 IronPython 相比,PyPy 能提供什么?

    从我在博客上看到和读到的内容来看 PyPy 是一个非常雄心勃勃的项目 与它的兄弟姐妹 CPython Jython 和 IronPython 相比 它会带来哪些优势 是速度 跨平台兼容性 包括移动平台 在没有 GIL 的情况下使用 c 扩展
  • 根据另一个参数的值添加参数

    根据输入之一 我想初始化某些对象 这些对象的值将是其余参数的默认值 因此 即使在 parser parse args 之前 我也需要参数之一的值 我如何使用 python argparse 模块来实现这一点 所有选项都将作为一个命令行给出
  • Django的注释框架和CSRF

    据我了解 Django的评论框架 https docs djangoproject com en 1 4 ref contrib comments 专为匿名公众评论而设计 就像您通常在博客或文章下面看到的那样 换句话说 任何人都可以发表评论
  • python中使用argsort进行排序

    我尝试对数组进行排序 import numpy as np arr 5 3 7 2 6 34 46 344 545 32 5 22 print unsorted print arr np argsort arr print sorted p
  • 删除 numpy 中的循环以进行简单的矩阵分配

    如何删除这个简单矩阵分配中的循环以提高性能 nk ncol nrow index shape for kk in range 0 nk for ii in range 0 nrow for jj in range 0 ncol idx in

随机推荐

  • QDIALOG 窗口级别模态

    这篇文章内容主要来自 QtQuarterly30 里面的 New Ways of Using QDialog 介绍的是使用QDialog open 这个函数是Qt 4 5 引入的 而不是传统的exec 来实现一个窗口级别的模态对话框 所谓模
  • 一键部署容器化版本,助力开发者快速试用WeDataSphere开源大数据平台套件

    一 部署WeDataSphere开源大数据平台的难点 您是否为搭建包含Hadoop Hive Spark等基础计算存储引擎的WeDataSphere 以下简称WDS 开源大数据平台套件而烦恼 是否希望能有一种简单快捷的方式来完成所有组件的部
  • 王道408计算机网络手写笔记 - 第六章 -应用层

    概览 6 1 网络应用模型 C S模型与P2P模型 1 6 2 域名系统DNS 层次域名 2 域名解析 3 6 3 文件传输协议FTP 4 6 34 电子邮件 MIME 5 SMTP POP3 IMAP 6 6 5 万维网WWW HTTP
  • jmeter对百度首页进行压力测试

    第一次测试 准备工作 在测试计划下添加jp gc Stepping Thread Group 阶梯线程组配置如下 该测试一共启动500个线程 每30秒增加10个 全部线程启动后 保持2分钟 然后每1秒停止5个线程 添加HTTP请求 添加查看
  • matlab:快速傅里叶(反)变换 FFT&IFFT

    文章目录 前言 一 傅里叶变换的离散性与周期性 二 MATLAB 实现快速傅里叶变换 FFT DFT 的计算 三 FFT 频谱的对称性 四 FFT 频谱的频率刻度 五 频谱图的绘制 半谱图 全谱图 六 练习 绘制cos信号的频谱图 半谱图
  • vue--富文本插件Quill(二)图片与视频上传

    前言 前言 上文介绍了quill的基础使用 这里主要针对我们不想以图片base64文本格式提交 而是上传服务器获取图片url 以url提交的实现方式以及视频上传的实现 思路 1 隐藏一个input框 使用quill的handler事件实现点
  • 怎么检查PCB layout?!推荐一款避坑神器

    原文来自公众号 工程师看海 公众号私信获取资料 DFM 对于硬件工程师而言 最紧张的时间节点就是发板前夕 画好的PCB要出Gerber文件给工厂 这Gerber文件是一定要仔仔细细检查 以前我一直用CAM350 这种检查纯靠 眼力 简单的板
  • fatal error: zlib.h: No such file or directory #include <zlib.h>

    在新安装的虚拟机Cent OS 7 9中 编译安装git 2 18 0源码时 报错 原因是缺少两个库 解决办法是先安装这两个库再重新编译 root用户下安装zlib和zlib devel yum y install zlib zlib de
  • 小程序开发:Component “路径“ does not have a method “方法名(p)“ to handle event “tap“

    今天在写小程序时 彻底掉坑了 习惯了js传参的写法 就在点击事件名后加了括号直接传 结果报错 WASubContext js t wechat s 1652063927164 v 2 20 1 2 Component pages demo
  • string替换所有指定字符串(C++)

    转自 http www vimer cn 2009 11 string E6 9B BF E6 8D A2 E6 89 80 E6 9C 89 E6 8C 87 E5 AE 9A E5 AD 97 E7 AC A6 E4 B8 B2 EF
  • React 中的重新渲染

    作者 梁瑞锋 晓玉 缘起 React 重新渲染 指的是在类函数中 会重新执行 render 函数 类似 Flutter 中的 build 函数 函数组件中 会重新执行这个函数 React 组件在组件的状态 state 或者组件的属性 pro
  • 文件服务器20t价格,20t的存储服务器

    20t的存储服务器 内容精选 换一换 鲲鹏BoostKit分布式存储基于鲲鹏硬件平台 端到端打通硬件 操作系统 中间件 分布式存储软件的全堆栈 主要价值如下 鲲鹏BoostKit分布式存储依靠多核高性能处理器 集成硬件压缩加速引擎 TaiS
  • git基于远程分支创建新分支

    步骤一 基于远程分支创建本地新分支 并切换到新分支 git checkout b 要创建的分支名 origin 要基于远程的分支 步骤二 注意 需要先把分支推送到远程 不然提交记录会提交到基于远程的那个分支上 git push set up
  • modbus读取保持寄存器实例

    读取108 110的实例 一共读取3个寄存器 请求 03 00 6B 00 03 03 功能码 表示读取保存寄存器 006B 十六进制表示107 从107开始往后读取 0003 十六进制表示读取3个寄存器 响应 03 06 02 2B 00
  • 一文看懂5种ESD防护方法!

    静电放电 ESD 理论研究的已经相当成熟 为了模拟分析静电事件 前人设计了很多静电放电模型 常见的静电模型有 人体模型 HBM 带电器件模型 场感应模型 场增强模型 机器模型和电容耦合模型等 芯片级一般用HBM做测试 而电子产品则用IEC
  • 【图像分类】 可解释性神经网络(可视化):CAM/Grad-CAM pytorch相关代码

    目录 前言 类激活图 CAM class activation map 可视化 1 1 CAM的工作原理 2 基于梯度的CAM Grad CAM pytorch 实现 Grad CAM 前言 神经网络往往被称为 黑盒 Model学到的知识很
  • flink kafka 消费以及生产并行度设置

    相同点都是 前面并行度 后面并行度 也就是要求前面并行度 gt 后面并行度 1 flink consumer kafka数据 mod kafka partiton flink 并行度 1 1 kafka flink 并行度 一对一的关系 1
  • java版仿拼多多Spring Cloud+SpringBoot+mybatis+uniapp b2b2c o2o 多商家入驻商城 直播带货商城 电子商务 拼团商城源码

    1 涉及平台 平台管理 商家端 PC端 手机端 买家平台 H5 公众号 小程序 APP端 IOS Android 微服务平台 业务服务 2 核心架构 Spring Cloud Spring Boot Mybatis Redis 3 前端框架
  • 最近抖音很火的情侣飞行棋html源码

    演示网站如下 https effect guoyaxue top fxq index html 游戏规则 1 摇筛子自动走棋 2 每个格子都有任务 也可以自行商量执行其他任务 3 率先走到终点的一方 获得胜利 2023 抖音情侣飞行棋网站源
  • 爬虫之lxml模块和xpath

    lxml模块 lxml 库是一款 Python 数据解析库 参考重要文档在 lxml Processing XML and HTML with Python 项目开源地址在 GitHub lxml lxml The lxml XML too