У меня есть плохо отформатированный 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, который по существу реализует API обхода jQuery. Что я пробовал до сих пор:
Селектор
: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 можно найти здесь.