【问题标题】:Need in depth absolute xpath of the text also using lxml getpath function还需要使用 lxml getpath 函数深入了解文本的绝对 xpath
【发布时间】:2018-10-05 05:55:32
【问题描述】:

在 R 中我可以得到想要的结果。

library(xml2)
root = read_html("<div><p>abc<br> xyz</p></div>")
elements = xml_find_all(root, "//.")
xml_path(elements)
#> [1] "/"                          "/html"                     
#> [3] "/html/body"                 "/html/body/div"            
#> [5] "/html/body/div/p"           "/html/body/div/p/text()[1]"
#> [7] "/html/body/div/p/br"        "/html/body/div/p/text()[2]"

节点
(/html/body/div/p/text()[1], /html/body/div/p/text()[2]) 是需要的。

在 python 中,当我使用 lxml 的 getpath 时出现错误,因为一些裸露的文本元素也与节点元素一起返回。

root = html.fromstring("<div><p>abc<br> xyz</p></div>")
elements = root.xpath("//.")
xpath_elements = [etree.ElementTree(root).getpath(x) for x in elements]

但是当我使用以节点结尾的 xpath 时,我不会得到与使用 R 的 xml2 相同的结果

root = html.fromstring("<div><p>abc<br> xyz</p></div>")
elements = root.xpath("//*")
xpath_elements = [etree.ElementTree(root).getpath(x) for x in elements]
print(xpath_elements)  

#> ['/html', '/html/body', '/html/body/div', '/div/p', '/div/p/br']

如何生成 R 的 xml2 库生成的所需 xpath 结果。

【问题讨论】:

  • 我认为python不加载html并且像xml一样工作,在这种情况下php像R一样工作,如果不存在则加载html/head/body。探测它由你自己添加。
  • 目标节点 xpath 应该像这样“*/text()[1]”结束。好吧,我会尝试找出解决方法。

标签: python xpath lxml


【解决方案1】:

lxml root.xpath(XPATH) 将文本节点作为字符串返回,而不是作为元素对象。

您可以尝试以下解决方法(它仍然无法以与 R 相同的方式工作):

elements = root.xpath("//*[text()]")
xpath_elements = []
for element in elements:
    for text_node in list(element.itertext()):
        if text_node.strip():
            xpath_elements.append(etree.ElementTree(root).getpath(element) + "/text()[%d]" % (list(element.itertext()).index(text_node) + 1))

print(xpath_elements)  # ['/div/p/text()[1]', '/div/p/text()[2]']

附:由于list.index(element) 返回第一个element 出现的索引,这不适用于具有完全相同文本节点的节点,例如&lt;p&gt;QWERTY&lt;br&gt;QWERTY&lt;/p&gt;。这是非常罕见的情况,但如果您也需要处理此类情况,请告诉我

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多