python - XPath 父节点的类不应包含特定字符串
问题描述
我正在尝试查找名称为“短语”且父节点名称不是“附加”的所有div
s 。class
class
所以在Python中我正在使用
for phrase in entry.iterfind(".//div[@class='phrase'] and ./parent::div[@class!='extras']]"):
要做到这一点。
但这给了我错误:
SyntaxError: prefix 'parent' not found in prefix map
我将上面的代码更改为
for phrase in entry.iterfind(".//div[@class='phrase'] and ./..[@class!='extras']]"):
这次的错误是
Traceback (most recent call last):File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/xml/etree/ElementPath.py", line 272, in iterfind
selector = _cache[cache_key] KeyError: (".//div[@class='phrase'] and ./..[@class!='extras']]", None)
部分 XML 结构如下:
<div class="phrases">
<div class="label">Phrases</div>
<div class="phrase">
……
<div class="phrasal verbs">
<div class="label">Phrases</div>
<div class="phrase">
……
<div class="extras">
<h2>test test</h2>
<div class="phrase">
……
我xml.etree
在 Mac OS 10.14 上使用 Python 3.7 和库。
解决方案
问题可能出在您当前的工具中,因为它可能不支持某些 XPath 语法。
您可以尝试使用 lxml.html来解析相同的 HTML-doc:
from lxml import html
source = """<div class="phrases">
<div class="label">Phrases</div>
<div class="phrase">this</div>
</div>
<div class="phrasal verbs">
<div class="label">Phrases</div>
<div class="phrase">this</div>
</div>
<div class="extras">
<h2>test test</h2>
<div class="phrase">not this</div>
</div>"""
dom = html.fromstring(source)
dom.xpath(".//div[@class='phrase' and ./parent::div[@class!='extras']]")
输出:
[<Element div at 0x7fb5218d5db8>, <Element div at 0x7fb521018728>] # Two elements found
或者
dom.xpath(".//div[@class='phrase' and ./parent::div[@class!='extras']]/text()")
输出:
['this', 'this']
推荐阅读
- css - 网格画廊之间的第一条和第二条线之间的空间
- bash - 如何分析 CI 工具中静默失败的图像构建?
- c# - C# bool 数组索引在声明和初始化时超出了数组的边界
- json - 如何在 Delphi 10 Seattle 中解析这个 json 数据?
- android - TextView 未显示在 RelativeLayout 中的 ImageView 下
- wpf - 无法使用 powershell 安装 MSIX 包
- php - 为什么 titleTextStyle 不能与 Google Charts 中的标题选项一起使用?
- javascript - 如何使用 Google App Script 执行行调用
- web - wget 将 .html 扩展名附加到字体文件中,是否可以禁用字体文件的该功能?
- node.js - 用于 windows 的 node.js BLE API 需要外部加密狗