1

我觉得我在这里遗漏了一些微妙的东西。

我有一个$doc我可以看到的$doc asText真正包含要解析的页面的内容。它来自dom parse -html5 $body.

从这里开始,我想以交互方式探索 DOM。例如,获取锚点列表。似乎$doc selectNodes {//a}可以工作*,但这不会返回任何东西。我也没有尝试其他任何东西selectNodes(/head,/body,/html ...什么都没有!)。我可以看到那里childNodes的结构似乎完好无损。

探索这些节点的更好方法是什么,以便我找出问题所在?

4

2 回答 2

3

这一次,您可以简化您的生活,因为您似乎使用 HTML(不是 XML 或 XHTML),因为您传递-html5dom parse,并选择 HTML 元素(锚点)。

到目前为止,HTML 没有命名空间的含义,因此您可以忽略它们。使用-ignorexmlns标志来dom parse.

% package req tdom
0.9.2
% set someHTML {<!DOCTYPE html>
<html>
  <head>
    <meta charset="UTF-8">
    <title>Title of the document</title></head><body>
    <svg width="100" height="100">
      <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
    </svg>
  </body>
</html>}
% set doc [dom parse -html5 -ignorexmlns $someHTML]

这样,您将能够运行您的 XPath 查询、不带命名空间感知的表达式:

$doc selectNodes {//svg}

请注意,这是tDOM的推荐用法:

由于这可能不是很多用户想要的,并且在很多用例中只会增加负担,因此 -html5 可以与 -ignorexmlns 结合使用,在这种情况下,DOM 树中的所有节点和属性都不在 XML 中命名空间。

于 2022-01-14T10:55:29.167 回答
1

运行$doc asXML显示 html 元素已被解析为命名空间:

<html xmlns="http://www.w3.org/1999/xhtml">

您将不得不使用此命名空间来查找元素:

$doc selectNodes -namespaces {ns http://www.w3.org/1999/xhtml} //ns:a

如果您要进行多个查询,一次设置命名空间会更容易:

$doc selectNodesNamespaces {ns http://www.w3.org/1999/xhtml}
$doc selectNodes //ns:a
$doc selectNodes /ns:html

等等。

于 2022-01-13T23:00:06.070 回答