2

我有一些格式不正确的 HTML(例如下面的 HTML),我想获取其文本与给定正则表达式匹配的叶节点(没有任何其他子节点):

<html>
  <head>
    <title>co20140725-ex99_1.htm</title>
  </head>
  <body bgcolor="#ffffff" style="DISPLAY: inline; FONT-FAMILY: Times New Roman; FONT-SIZE: 10pt">
  <div>
  <div style="TEXT-ALIGN: left">&#160;</div>
  <div style="TEXT-ALIGN: right">EXHIBIT 99.1</div>
  <div style="TEXT-ALIGN: left">&#160;</div>
  <div style="TEXT-ALIGN: left">
  <div style="TEXT-INDENT: 0pt; DISPLAY: block; MARGIN-LEFT: 0pt; MARGIN-RIGHT: 0pt" align="left">
  <div style="TEXT-ALIGN: center"><font style="FONT-WEIGHT: bold">ANNOUNCES</font></div>
</html>

我正在使用cheerio,它本质上实现了jQuery 遍历API。到目前为止我已经尝试过:

  1. 选择:contains器不支持正则表达式,甚至不区分大小写的文本:

    var text = $('body').filter(':contains("ANNOUNCES")');
    
  2. each,然后是标准的 JavaScript match

    $('body').each(function (i, elem) {
      if ($(this).text().match(/announces/i)) {
        var text = $(this).text();
      }
    }
    
  3. children,但它输出一个字符串,即 HTML 中的所有文本:

    $('p, b, div, font').children(':contains("string I\'m looking for but this isn\'t case-sensitive like match is")').children().first().text();  
    

我认为问题在于嵌套子元素的数量可变,出于某种原因,我确实得到了所有元素,但是每个元素都有一堆子元素,我无法遍历它们并且测试文本。

这就是我的对象的样子

您可以看到有一堆可变嵌套的元素,通常.find()可以用于搜索中的所有元素,<body>但在这种情况.find().filter()根本不起作用。

关于如何对这个 HTML 中的文本进行正则表达式搜索的任何想法?

可以在此处找到完整的 HTML 示例。

4

1 回答 1

2

澄清后,问题分为两部分:

  1. 仅获取叶节点,即那些没有自己的子节点但仅包含您所追求的文本的节点。这将避免您在使用第三种方法时遇到的问题children。有两种方法可以做到这一点:

    • 选择*:not(:has('*'))
    • 选择所有元素 ( '*') 然后过滤具有零子节点的节点。这比流行的复杂选择器方法快几倍。
  2. textContent过滤与您的正则表达式匹配的叶节点。

这是代码:

$('*').map(function() {
  if (this.children.length) return null;
  if (this.textContent.match(/N/)) return this.textContent;
});

这是JSBin。(忽略window.runnerWindow.proxyConsole无关的输出;它是 JSBin 工件。)

于 2014-07-28T22:23:31.593 回答