【问题标题】:How to select all script nodes containing a specific string如何选择包含特定字符串的所有脚本节点
【发布时间】:2012-09-03 19:45:25
【问题描述】:

假设我在一个 HTML 文档中有多个脚本节点,我将如何选择所有包含特定源值的节点:

<head>
</head>
<body>
    <script type="text/javascript">
        blah();
    </script>
</body>

只选择正文中包含函数blah的脚本节点的正确方法是什么?

更新

我试过//script[contains(text(), 'blah')],但没用。

【问题讨论】:

  • 不可能像//script[contains(., 'blah')]这么简单吧?
  • 我一直在尝试//script[contains(text(), 'blah')],但它不起作用...有没有办法限制只在正文中查找脚本节点?
  • //script[contains(text(), 'blah')] 应该也可以。知道为什么它不适合你会很有趣。
  • @Tomalak 它也适用于text(),一定是某个地方有错字。

标签: c# html xml xpath


【解决方案1】:

//script[contains(., 'blah') 应该可以工作 和...之间的不同 。而 text() 是可以有多个文本节点(理论上),而 text() 匹配所有这些节点的序列。

另一种可能性是您拥有 XHTML,并且需要将 XHTML 命名空间绑定到前缀,例如“h”,比如说,//h:script[contains(., 'blah')],以及如何做到这一点取决于确切的调用环境,例如registerNamespace() 什么的。您需要在文档中注册与 xmlns="...." 中相同的 URI,很可能是 http://www.w3.org/1999/xhtml,例如如果您在 .net 中使用 XmlDocument,就像这样:

System.Xml.XmlNamespaceManager xmlnsManager =
                 new System.Xml.XmlNamespaceManager(xmldoc.NameTable);

xmlnsManager.AddNamespace("h", "http://www.w3.org/1999/xhtml", xmlnsManager);

result = xmldoc.SelectNodes('//h:script[contains(., 'blah')]')

【讨论】:

    【解决方案2】:

    使用 javascript 搜索功能遍历每个脚本元素怎么样?

    http://www.w3schools.com/jsref/jsref_search.asp

    <script type="text/javascript">
        var s = document.getElementsByTagName('script'); 
    
        for (var i = 0; i < s.length; i++) {
            var src = s[i].innerText;
            var result = src.search("blah()");
            if (result != -1) {     
                console.log(src);
            }
        }
    
    </script>
    

    脚本应该进入页面加载逻辑以处理在此之后出现的所有脚本元素。

    【讨论】:

    • 1,w3schools 不是可靠的信息来源(参见 w3fools.com) 2,问题被标记为 XPATH,所以这不是答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    • 2021-02-23
    • 1970-01-01
    相关资源
    最近更新 更多