如何使用 lxml 从此 HTML 片段获取文本?

2023-12-01

谁能解释为什么这个片段在断言上失败?

from lxml import etree

s = '<div><h2><img />XYZZY</h2></div>'

root = etree.fromstring(s)

elements = root.xpath(".//*[contains(text(),'XYZZY')]")  # Finds 1 element, as expected

for el in elements:
    assert el.text is not None

然后...我怎样才能访问“XYZZY”并将其更改为“ZYX”?


谁能解释为什么这个片段在断言上失败?

因为文中的<h2>元素由 lxml 存储在该元素的子元素之一中h2元素。您可以使用itertext()得到你正在寻找的东西。

from lxml import etree
s = '<div><h2><img />XYZZY</h2></div>'
root = etree.fromstring(s)
elements = root.xpath(".//*[contains(text(),'XYZZY')]")
for el in elements:
    el_text = ''.join(el.itertext())
    assert el_text is not None
    print(el_text)

更新:进一步查看后,发现每个元素都有 3 个相关属性:.tag, .text and .tail.

For the .tail财产,教程中有一小部分这解释了它:

<html><body>Hello<br/>World</body></html>

在这里,
标签被文本包围。这通常被称为 文档样式或混合内容 XML。元素通过它们的支持这一点 尾部财产。它包含直接跟在元素后面的文本, 直到 XML 树中的下一个元素

How .tail正在填充的是这里再次解释:

LXML 附加尾随文本,该文本未包装在其自己的标签内,因为.tail之前标签的属性。

所以我们实际上可以编写以下代码,遍历元素树中的每个元素并找到文本所在的位置XYZZY位于:

from lxml import etree
s = '<div><h2><img />XYZZY</h2></div>'
root = etree.fromstring(s)

context = etree.iterwalk(root, events=("start","end"))
for action, elem in context:
    print("%s: %s : [text=%s : tail=%s]" % (action, elem.tag, elem.text, elem.tail))

Output:

start: div : [text=None : tail=None]
start: h2 : [text=None : tail=None]
start: img : [text=None : tail=XYZZY]
end: img : [text=None : tail=XYZZY]
end: h2 : [text=None : tail=None]
end: div : [text=None : tail=None]

所以它位于.tail的财产<img>元素。

关于你的第二个问题:

然后...我怎样才能访问“XYZZY”并将其更改为“ZYX”?

一种解决方案是仅遍历元素树,检查每个元素的文本或尾部是否包含该字符串,然后替换它:

#!/usr/bin/python3
from lxml import etree
s = '<div><h2><img />XYZZY</h2></div>'
root = etree.fromstring(s)

search_string = "XYZZY"
replace_string = "ZYX"

context = etree.iterwalk(root, events=("start","end"))
for action, elem in context:
    if elem.text and elem.text.strip() == search_string:
        elem.text = replace_string
    elif elem.tail and elem.tail.strip() == search_string:
        elem.tail = replace_string

print(etree.tostring(root).decode("utf-8"))

Output:

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

如何使用 lxml 从此 HTML 片段获取文本? 的相关文章

  • numba.prange 性能不佳

    我试图整理一个简单的例子来说明使用的好处numba prange对于我自己和一些同事来说 但我无法获得像样的加速 我编写了一个简单的一维扩散求解器 它本质上是在一个长数组上循环 组合元素i 1 i and i 1 并将结果写入element
  • 添加图例到散点图

    这个问题已经被问到了 但我想找到一个更清晰的解决方案 给定 X 是 100x2 数据 标签是标签向量 从 1 到 9 我绘制散点图如下 pl scatter X 0 X 1 c labels pl show 如何仅用一行代码添加图例来解释颜
  • 我是否必须覆盖子类中的所有数学运算符?

    我想在 Python 3 7 程序中创建一个简单的 Point2d 类 仅实现一些功能 我在一个 SO 答案中看到 我现在找不到 创建 Point 类的一种方法是重写complex所以我写了这个 import math class Poin
  • 使用输入按钮处理网站上的分页

    试图使用硒抓取这个网站 我的代码可以工作 但目前它只抓取第一页 该页面使用输入按钮作为浏览页面的一种方式 因此我想逐个单击每个按钮 但它不起作用 有没有人有任何其他方法来处理此类分页的导航 import requests from sele
  • JaxB2Marshaller 未将 XML 绑定到 Kotlin 数据类

    我正在编写一个批处理作业来解析 XML 提取字段并将它们保存在数据库中 解析 XML 时 它会选取 2 个根元素 但将所有字段保留为空 因此在我的数据库中 我有 2 条记录将为空字段 似乎无法弄清楚为什么它无法读取元素 TIA Bean f
  • 在 Linux 上创建线程与进程的开销

    我试图回答在 python 中创建线程与进程有多少开销的问题 我修改了类似问题的代码 该问题基本上运行一个带有两个线程的函数 然后运行带有两个进程的相同函数并报告时间 import time sys NUM RANGE 100000000
  • python subprocess proc.stderr.read() 引入额外的行?

    我想运行一些命令并抓取输出到 stderr 的任何内容 我有两个版本的函数可以执行此操作 版本 1 def Getstatusoutput cmd Return status output of executing cmd in a she
  • Python 字典不按顺序排列

    我创建了一个字母表字典 其值从0开始 并根据单词文件增加一定的量 我对最初的字典进行了硬编码 我希望它保持按字母顺序排列 但事实并非如此 我希望它按字母顺序返回字典 基本上与初始字典保持相同 我怎样才能保持秩序 from wordData
  • QFileDialog 作为 TableView 的编辑器:如何获取结果?

    我正在使用一个QFileDialog作为某些专栏的编辑QTableView 这基本上有效 对一些焦点问题取模 请参阅here https stackoverflow com questions 22854242 qfiledialog as
  • Java DocumentBuilder - XML 文件中的缩进错误

    我尝试使用 DocumentBuilder 用 Ja va 编写一个简单的 XML 文件 我期望 XML 文件如下所示
  • 如何从包含许多表的 Excel 工作表中解析数据帧(使用 Python,可能使用 Pandas)

    我正在处理布局糟糕的 Excel 工作表 我正在尝试解析这些工作表并将其写入数据库 每个工作表可以有多个表 尽管这些可能的表格的标题是已知的 但哪些表格将位于任何给定的工作表上 它们在工作表上的确切位置也不是已知的 表格不以一致的方式对齐
  • 将误差线添加到 3D 绘图

    我找不到在 matplotlib 的 3D 散点图中绘制误差条的方法 基本上 对于以下代码段 from mpl toolkits mplot3d import axes3d import matplotlib pyplot as plt f
  • 在地图类型中创建 DataFrame 分组列

    My 数据框具有以下结构 df spark createDataFrame B a 10 B b 20 C c 30 Brand Type Amount df show Brand Type Amount B a 10 B b 20 C c
  • 使用 pywin32com 进行 opc 的内存泄漏

    我很难弄清楚如何解决内存泄漏问题 我认为这可能是 pywin32 的问题 但我不完全确定 我用于读取 写入单个项目的代码似乎工作得很好 但是当使用组函数时 它会慢慢泄漏内存 我怀疑这是来自必须在 server handles 中传递的基于
  • 哪些 2to3 修复程序输出有效的 Python 2 代码?

    2to3 是一个 Python 程序 它读取 Python 2 x 源代码并应用一系列修复程序将其转换为有效的 Python 3 x 代码 考虑一下列出的四十个修复者https docs python org 3 library 2to3
  • 在硬件级别模拟按键 - Windows

    我正在寻找一种语言或库 使我能够在最大可能的水平上模拟击键 而无需实际按下按键 我对击键级别的具体衡量标准是 当我的计算机已经运行按键侦听器 例如鼠标键和粘滞键 时 它是否会产生与物理按键相同的输出 我尝试过很多击键模拟的方法 java A
  • 采用迭代器而不是可迭代的方法[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 关于迭代器和可迭代对象 仅是我的观察 如果我错了 请纠正我 大多数构造函数 数组类型 将迭代器作为质量构造函数 迭代器是显式创建的 或
  • 用python在pygame中制作一个8*8的棋盘

    我想用 python 在 pygame 中制作一个棋盘 只是带有 for 循环的棋盘 我尝试了多种方法来做到这一点 但我不知道它到底是什么 这是我的代码 import pygame pygame init set color with rg
  • Pandas - 过滤器和正则表达式搜索 DataFrame 的索引

    我有一个 DataFrame 其中列是 MultiIndex 索引是名称列表 即index Andrew Bob Calvin 我想创建一个函数来返回数据帧中使用名称 Bob 或以字母 A 开头或以小写字母开头的所有行 如何才能做到这一点
  • XSD、泛型和 C# 类的困境

    我有以下简单的 XSD 文件

随机推荐

  • 使用rhandsontable R包生成的表时如何实现shinyStore?

    我正在尝试实现帖子中答案中的 保存 功能如何在 R Shiny 中使用 DT 的 localStorage 选项 进入我用 rhandsontable 渲染的表 但它不起作用 那篇文章涉及表包 DT 而我正在使用 rhandsontable
  • 如何用数学方法缩短网址

    我正在研究使用算法缩短 加密长度为 150 到 250 个字符到最多 12 个字符的 url 的可能性 最初我怀疑这是否可能 但我想利用 StackOverflow 的伟大思想 该算法应该是可以用经典的 asp sql c vb foxpr
  • 如何在android模拟器中运行特定的活动?

    我已经在 Eclipse 中创建了 4 个活动 现在我想在模拟器中分别一一运行活动 1 2 3 4 进行测试 谁能指导我如何运行所有这些 当我按下运行按钮时 它只运行第一个活动 任何帮助 将不胜感激 您可以尝试 startActivityF
  • 无法从 BASH 中的 WHILE 中获取变量的值

    我有一个代码 od An t x1 lt file while read line do for char in line do if needspace eq 0 then export hexs hexs printf 2s char
  • 如何移动放置在容器底部的最小化组件?

    我的容器中有三个组件 其中有按钮 当我点击最小化按钮时 组件会最小化到容器的底部 当我点击最小化组件时 它会最大化 假设三个组件位于底部 如果我最大化第二个组件 那么它就会最大化 而第三个最小化组件不会占据第二个组件的位置 并且这仍然是空间
  • 如何在 Code::blocks 中使用自定义项目模板

    在 MS Visual studio 中 我可以制作自己的项目 然后将其保存为自定义模板以供下次使用 有谁知道如何在代码块中做到这一点 一张图片胜过千言万语 https i stack imgur com BX5lM png
  • Raspberry pi 与 pygame.mixer 音频仅产生静态

    我对树莓派很陌生 而且很新 但我试图通过 pi B 上的 python 文件播放音频文件 我使用 omxplayer 从命令行播放音频 它工作正常 但是当我运行以下命令时它仅播放静态代码 from pygame import mixer m
  • 在Java中表示卡片的类?

    我正在用 Java 编写一个二十一点程序 并且开始为对象 Card 编写类声明 这足够了 还是有一些我应该掩盖的方法 public class Card public int suit Value 1 4 to represent suit
  • 如何使用锁定提示以便两个并行查询返回不相交的结果?

    我有一个 SQL 表Tasks有柱子Id and State 我需要执行以下操作 找到任何一项具有状态的任务ReadyForProcessing 检索其所有列并将其状态设置为Processing 类似于 伪代码 BEGIN TRANSACT
  • GCC LTO 是否执行跨文件死代码消除?

    说我有一个函数 void do something ifdef FEATURE X feature x endif 我可以毫无问题地编译和运行它 如果我想要这个功能我可以通过 D FEATURE X它有效 但是 如果我想把do someth
  • 长时间运行的线程如何在 Web 应用程序中工作

    所以我在 MVC 控制器方法内部有以下代码 public ActionResult ProcessFile ThreadStart threadStart new ThreadStart gt Doing some long process
  • 使用 dplyr mutate 根据列名向量创建新列

    我想获取一些列的日志 并创建全部命名为 log 原始列名称 的新列 下面的代码有效 但是我如何传递名为columnstolog变异 谢谢 library dplyr data mtcars columnstolog lt c mpg cyl
  • 适用于 Twitter API 的 Windows Phone SDK

    我想在 WindowsPhone7 上为 Twitter 开发一个示例应用程序 所以有人建议我是否有适用于 Windows Phone 的 SDK 可用 还有 OAuth API 实现的任何代码示例 谢谢 有一些关于构建 Twitter 应
  • 在 C 语言中 strcmp() 到底返回什么?

    我用 C 语言编写了这段代码 include
  • 使用 COALESCE 函数使值以逗号分隔

    我有一张桌子 EMP 我知道使用COALESCE函数我们可以通过这种方式获取任意列的值 23 23 45 34 SELECT OfferID FROM Emp where EmpID 23 但我没有得到实现此目的的语法 任何帮助都会很好地解
  • NPAPI 插件之上的 HTML

    在我使用 FireBreath 和 OpenGL 编写完浏览器插件并使用对象标签嵌入插件后 我尝试在插件之上覆盖各种 HTML 元素 不幸的是 无论我如何尝试 标签和插件图形始终位于页面上任何其他 HTML 元素的顶部 据我所知 flash
  • 使用 awk 在数字和数字之间转换月份

    在过去的考试试卷中 我有一个问题 月份可以用不同的方式表示 例如数字 1 2 12 或三字母月份名称 Jan Feb Dec 建议如何使用 awk 中的关联数组来转换 三个字母的月份名称到月份数字 反之亦然 到 将月份数字翻译为三个字母的月
  • nodejs - mongodb - 如何找到所有a!= b?

    这是征集会 id R65i3SmvucW9imK2cxA6wdFb GXoSHjly7obzFNslklNCBvE0UrW qOiNmiBtPN24 1c session channel all username xuka expires
  • STL 容器分配放置新

    我找不到这个问题的确切答案 因此在这里发帖 当我想到向量时 它需要在连续的内存位置构建对象 这意味着向量保持分配的内存 并且必须对推入其中的对象进行就地构造 放置新的 这是一个有效的假设吗 另外 这是否意味着容器正在手动调用析构函数而不是调
  • 如何使用 lxml 从此 HTML 片段获取文本?

    谁能解释为什么这个片段在断言上失败 from lxml import etree s div h2 img XYZZY h2 div root etree fromstring s elements root xpath contains