XPath - 提取两个节点之间的文本

2024-02-26

我的 XPath 查询遇到问题。我必须解析一个 div,它被划分为未知数量的“部分”。其中每一个都由 h5 和部分名称分隔。可能的部分标题列表是已知的,并且每个标题只能出现一次。此外,每个部分可以包含一些 br 标签。所以,假设我想提取“SecondHeader”下的文本。

HTML

<div class="some-class">
 <h5>FirstHeader</h5>
  text1
 <h5>SecondHeader</h5>
  text2a<br>
  text2b
 <h5>ThirdHeader</h5>
  text3a<br>
  text3b<br>
  text3c<br>
 <h5>FourthHeader</h5>
  text4
</div>

预期结果(第二部分)

['text2a', 'text2b']

Query #1

//text()[following-sibling::h5/text()='ThirdHeader']

结果#1

['text1', 'text2a', 'text2b']

这显然有点太多了,所以我决定将结果限制为所选标题和之前标题之间的内容。

Query #2

//text()[following-sibling::h5/text()='ThirdHeader' and preceding-sibling::h5/text()='SecondHeader']

结果#2

['text2a', 'text2b']

取得的成果符合预期。但是,这不能使用 - 我不知道 SecondHeader/ThirdHeader 是否会存在于解析的页面中。在查询中只需要使用一个章节标题。

Query #3

//text()[following-sibling::h5/text()='ThirdHeader' and not[preceding-sibling::h5/text()='ThirdHeader']]

结果#3

[]

你能告诉我我做错了什么吗?我已经在谷歌浏览器中测试过了。


If all h5元素和文本节点是兄弟节点,您需要按部分分组,一个可能的选项是简单地按计数选择文本节点h5之前的。

使用示例lxml(Python)

>>> import lxml.html
>>> s = '''
... <div class="some-class">
...  <h5>FirstHeader</h5>
...   text1
...  <h5>SecondHeader</h5>
...   text2a<br>
...   text2b
...  <h5>ThirdHeader</h5>
...   text3a<br>
...   text3b<br>
...   text3c<br>
...  <h5>FourthHeader</h5>
...   text4
... </div>'''
>>> doc = lxml.html.fromstring(s)
>>> doc.xpath("//text()[count(preceding-sibling::h5)=$count]", count=1)
['\n  text1\n ']
>>> doc.xpath("//text()[count(preceding-sibling::h5)=$count]", count=2)
['\n  text2a', '\n  text2b\n ']
>>> doc.xpath("//text()[count(preceding-sibling::h5)=$count]", count=3)
['\n  text3a', '\n  text3b', '\n  text3c', '\n ']
>>> doc.xpath("//text()[count(preceding-sibling::h5)=$count]", count=4)
['\n  text4\n']
>>> 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

XPath - 提取两个节点之间的文本 的相关文章

随机推荐

  • 删除 Meshlab 或 vcglib 中的自相交

    如何使用 Meshlab 应用程序或 vcglib 消除网格的自相交 这超出了范围 但 CGAL 中有一些函数 这仍然是实验性的 没有记录 但您可以使用该功能remove self intersections https github co
  • 不包含适合入口点的静态“main”方法

    我今天开始将代码组织到单独的 cs 文件中 为了允许与 UI 一起使用的方法继续这样做 我将在相同的命名空间和公共部分类名下创建 cs 代码 以便这些方法可以可互操作 我的标头在四个文件中看起来像这样 包括调用的主核心文件 public s
  • 内存警告但活动字节较小

    在我的应用程序中 在重复某些操作 选择图片 处理 多次后 我收到级别 1 的内存警告 然后收到级别 2 的内存警告 然后崩溃 泄漏工具没有显示任何泄漏 我还关注 Instruments 中的分配工具 我的实时字节大约为 4 MB 总共分配了
  • sqldf:从数据帧创建表错误:“没有这样的表”。并创建了两张表而不是一张

    我最近升级了 R RSQLite 和 sqldf 以下版本 通常情况下 sqldf create table foo as select from bar db test db 应该在附加的 sqlite 数据库中创建一个名为 foo 的表
  • 在 Reactjs 中迭代数组

    const cal days Sun Mon Tue Wed Thu Fri Sat const cal months Jan Feb March April May June July August Sept Oct Nov Dec co
  • 组合 Group-Object 和 ForEach-Object?

    我正在开发一个名为Merge Xsd可以合并相似的 XML 模式 它需要一个路径列表 加载模式 合并它们 并生成一个XMLDocument作为输出 特定文件名的所有模式都被认为是 相似的 所以我正在做的就是获取特定目录结构中的所有子项 根据
  • 使用useEffect获取数据时避免使用旧数据

    我的问题是 当自定义挂钩使用useEffect with useState 例如 为了获取数据 在依赖项更改之后但在 useEffect 被触发之前 自定义挂钩会返回过时的数据 来自状态 您能建议一种正确 惯用的方法来解决这个问题吗 我正在
  • 针对具有大量聚合的大型集群的 ElasticSearch 设置

    背景和当前状态 我们正在将集群从 Cassandra 迁移到完整的 ElasticSearch 集群 我们平均索引文档为每秒约 250 300 个文档 在 ElasticSearch 1 2 0 中 它代表每天约 8Go generic i
  • Android 如何避免内存不足错误

    我有很多图像 大约有 500 张分布在 20 个左右的片段中 这些图像都非常小 并且加载得很好 但是我给用户提供了 3 种不同类型的图像的选择 现在如果用户更改图像我收到 OOM 错误 所以我认为这是我处理图像的方式 我认为我需要先回收旧图
  • 基于另一个字段更改 SSRS 中值字符串中特定值文本颜色的表达式

    我的 SSRS 报告中有一个字段 其中包含一串用逗号分隔的数字 来自 SQL 中的合并选择 它看起来像 12 91 160 171 223 如果该值也在报告的另一个字段中 我只想更改该字段中一个特定值 例如 160 的文本颜色 我已经有了这
  • 使用 BigDecimal 计算小数点后的最大位数

    小数点后最多可以有多少位BigDecimalJava 中的值 它 几乎 是无限的 如果将比例设置为整数的最大值 则可以存储大约 20 亿位小数点后的数字 但如果尝试这样做 可能会耗尽内存 如果您需要存储如此多的数字以至于限制成为问题 那么您
  • 如何将UIImage插入到UITextView中

    我正在开发一个可编辑的笔记本类型项目 它随时由一些文本和图像组成 在UITextView如果我们将图像添加为子视图 则帧是固定的 但我有editable选项 所以我必须将图像另存为NSString格式为UITextView 但它应该在 ui
  • AutoMapper 4.2 和 Ninject 3.2

    我正在更新我的一个项目以使用 AutoMapper 4 2 并且遇到了重大更改 当我seem为了解决上述更改 我并不完全相信我已经以最合适的方式做到了这一点 在旧代码中 我有一个NinjectConfiguration 和AutoMappe
  • Android 2.1 WebView 中的 SIGSEGV

    在 Android 2 1 中使用 WebView 时 我间歇性地收到 SIGSEGV SIGSEGV 位于 system lib libwebcore so 内 此 WebView 实现是否存在已知问题 我可以解决该问题以避免 SEGV
  • 由于零而始终将滑块求和到 100% 失败的算法

    这是 应该是 一个函数 它确保多个滑块值的总和always总计为globalTotal 用户可以手动更改滑块值changer value然后当将此函数应用于other滑块 它可以确定它们的新或endVal 它需要startVal需要更改的滑
  • 初学者使用 Linqpad 运行非常基本的 linq to sql 查询的步骤

    尝试使用 Linq 学习LinqPad http www linqpad net 并对如何开始感到沮丧 假设我想编写一个 C 表达式和一个 C 语句 其中 SQL Server 中有一个名为 Products 的表 并且我想提取价格大于 5
  • 使用 lucene/java 标记名称

    我有我公司所有员工的姓名 超过 5000 名 我想编写一个引擎 它可以在在线文章 博客 维基 帮助文档 中即时查找名称 并用用户电子邮件的 mailto 标签标记它们 截至目前 我计划从文章中删除所有停用词 然后在 lucene 索引中搜索
  • 手动修改 DOM 的 innerHTML 会停止 ReactJS 监听器

    我正在学习 ReactJS 和 Node Express 生态系统 对我来说是早期 我有一个基本的 ReactJS 文件 包括组件定义和渲染调用 它本身按预期工作 为了快速 轻松地进行调试 昨天我在客户端代码中进行了以下更改 Added H
  • 在运行时将设计时面板添加到 TabPage

    我希望在设计时有一个带有控件的面板 但我想在运行时将此面板添加到 TabControl 的所需 tabPage 中 我写了这样的东西 没有用 面板没有显示在选项卡页中 请帮我 panel2 Parent tabGuy TabPages 0
  • XPath - 提取两个节点之间的文本

    我的 XPath 查询遇到问题 我必须解析一个 div 它被划分为未知数量的 部分 其中每一个都由 h5 和部分名称分隔 可能的部分标题列表是已知的 并且每个标题只能出现一次 此外 每个部分可以包含一些 br 标签 所以 假设我想提取 Se