jquery - 使用 Cheerio 正则表达式搜索格式不良的 HTML 的叶节点

标签 jquery html parsing nodes cheerio

我有一些格式很差的 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();  
    

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

This is what my object looks like

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

关于如何使用正则表达式搜索此 HTML 中的文本有什么想法吗?

完整示例 HTML 可以在 here 找到.

最佳答案

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

  1. Get only the leaf nodes ,也就是说,那些没有自己的子项,但只包含您要查找的文本的内容。这将避免您在使用 children 的第三种方法中遇到的问题。有两种方法可以做到这一点:

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

代码如下:

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

Here's the JSBin. (忽略 window.runnerWindow.proxyConsole 无关输出;它是 JSBin 工件。)

关于jquery - 使用 Cheerio 正则表达式搜索格式不良的 HTML 的叶节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24988030/

相关文章:

javascript - 如何在 jQuery 中解析 JSON 多维数组?

javascript - 使用 Jquery 检查时通过复选框更改背景颜色

html - CSS - flex 属性

jquery - 在表单提交中,当我进入下一页时,数据没有出现

jquery - 在视频标签中隐藏放大控件 - Edge 和 IE

javascript - angularjs - ng-file-upload 未将模型绑定(bind)到动态创建的 HTML 表单

java - 使用 jsoup 解析脚本(JSON 数据)

java - 类似结构的源代码解析和类似宏的处理

javascript - jQuery 获取无法作为对象访问的数据

javascript - ajax 数据在 jquery 的点击事件中不起作用