我正在尝试解析包含低于此符号的数字数据,如下所示: < 0.003 在文档中使用此原始标记进行解析;
<TD VALIGN=TOP><P ALIGN=LEFT>
<FONT FACE="Helvetica">
<SPAN STYLE="Font-Size: 12pt"><0.0003</SPAN>
</FONT>
</TD>
问题是cheerio将其作为一个未关闭的html标记处理并关闭它,生成一个带有值的标记,如下所示:
<td valign="TOP">
<p align="LEFT">
<font face="Helvetica">
<span style="Font-Size: 12pt">
<0.0003< span=""></0.0003<>
</span>
</font>
</p>
</td>
我试过没有运气的选项decodeEntities:true
如何正确获取值?
感谢。
答案 0 :(得分:0)
您之所以看到这一点,是因为就HTML而言,裸<
是一个非法字符,这会对cheerio产生大量伤害,因为cheerio的输入很好定义。
(虽然您可能会认为应该导致浏览器无法呈现页面,但"official" HTML specification表明浏览器应该像他们可以使用的那样宽容&#34;格式错误& #34;输入。)
解决此问题的一种方法是通过正则表达式运行您的内容,以便正确地将所有裸<
(之前出现的内容)转换为正确的HTML实体:&#39;&lt;&#39;如:
// assumes the page content is kept in this var.
var content = '<p>1 < 2<br/>3</p>2 < 3';
content=content.replace(/<([^<>]+(?:<|$))/g,'<$1');
将产生:
<p>1 < 2<br/>3</p> 2 < 3
正则表达式为:
< -- literal '<'
( -- start capture group #1
[^<>]+ -- one or more characters except literal '<' or '>'
(?: -- start non-capturing group
< -- literal '<'
| -- OR
$ -- end of content
) -- end of non-capturing group
) -- end of capture group #1
将/g
标志添加到正则表达式会导致它在模式与内容匹配时运行多次。
答案 1 :(得分:0)
github
中有关于解析html的自定义选项的开放issue。预计将来。
var $ = cheerio.load('<TD VALIGN=TOP>kk<P ALIGN=LEFT><FONT FACE="Helvetica"><SPAN STYLE="Font-Size: 12pt">>0.0003</SPAN></FONT></TD>');
$("*").each(function(i, elem) {
console.log($(elem)[0].name);
});
$(elem)[0].name
将记录所有标记名称,您可以使用一些正则表达式来过滤掉该数字。
Note:
问题仅适用于<
符号。对于>
符号,它将解析为>