我有一些格式很差的 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"> </div>
<div style="TEXT-ALIGN: right">EXHIBIT 99.1</div>
<div style="TEXT-ALIGN: left"> </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。到目前为止我尝试过的:
:contains
选择器不支持正则表达式,甚至不支持大小写不敏感的文本:var text = $('body').filter(':contains("ANNOUNCES")');
each
,然后是标准 JavaScriptmatch
:$('body').each(function (i, elem) { if ($(this).text().match(/announces/i)) { var text = $(this).text(); } }
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 可以在 here 找到.
最佳答案
澄清后,问题分为两部分:
Get only the leaf nodes ,也就是说,那些没有自己的子项,但只包含您要查找的文本的内容。这将避免您在使用
children
的第三种方法中遇到的问题。有两种方法可以做到这一点:*:not(:has('*'))
选择器- 选择所有元素 (
'*'
),然后筛选具有零个子元素的节点。这比流行的复杂选择器方法快几倍。
过滤叶节点,查找
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/