【问题标题】:lxml xpath - Can't find body taglxml xpath - 找不到正文标签
【发布时间】:2020-05-13 15:40:04
【问题描述】:

我正在尝试在 Calibre 中编写一个插件,用于检查 epub 文档中的脚注(基本上是寻找 font-size <body> 标签内)中获取所有子标签,但我遇到了一个问题。

LXML xpath 找不到 &lt;body&gt; 或其中的任何内容。

下面是使用 Calibre 自己的函数创建的 html 和使用 etree.SubElement 插入的 &lt;p&gt;Hello World&lt;/p&gt;

<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <title>Hero filtered</title>
  <link href="page_styles.css" rel="stylesheet" type="text/css"/>
  <link href="stylesheet.css" rel="stylesheet" type="text/css"/>
</head>

<body>

<p>Hello World</p></body>
</html>

这些都是我尝试过的东西

query = ".//body" # This doesn't 
query = "body" # This doesn't 
query = ".//*/body" # This doesn't 
query = ".//*//body" # This doesn't
query = "./body" # This doesn't 
query = ".//body/*" # This doesn't 
query = ".//body/p" # This doesn't 

这些确实有效

query = "/*/*[2]/*[normalize-space(text())]" # this works
found= self.footnotes_file.find("{*}" + "body") # this works

我一直在使用 lxml 中的以下函数

found = self.footnotes_file.xpath(query)

self.footnotes_file 是使用 Calibre 函数 parsed(self, name) 生成的,该函数返回传递给它的 html 文件的根元素

self.footnotes_file = current_container().parsed(footnote_file_name)

所以问题是我做错了什么!

【问题讨论】:

    标签: html xpath tags find lxml


    【解决方案1】:

    您似乎遇到了命名空间的问题。有几种方法可以处理它。 两个简单的方法是从

    中删除命名空间引用
    <html xmlns="http://www.w3.org/1999/xhtml">
    

    这样标签就是&lt;html&gt;

    另一个是将查询更改为

    //*[local-name()="body"]
    

    看看这些是否有效。

    【讨论】:

    • 谢谢杰克,完美的答案。我选择了第二个选项,因为 Calibre 创建了 html 模板,并且继续删除 xmlns 属性似乎太过分了。只是出于兴趣,有没有一种方法可以使用命名空间创建 xpath 查询?
    • @Rob 是的。但是为了使其(几乎)易于管理,您必须为命名空间创建一个前缀(某种快捷方式)。例如,在您的情况下,您可以使用('//x:body', namespaces = {'x':'http://www.w3.org/1999/xhtml'})x 是任何东西。我个人会坚持使用local-name()
    • 我完全同意。感谢您的帮助
    猜你喜欢
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    相关资源
    最近更新 更多