用nodejs和cheerio解析低于符号

时间:2015-06-16 17:47:26

标签: node.js parsing cheerio

我正在尝试解析包含低于此符号的数字数据,如下所示: < 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

如何正确获取值?

感谢。

2 个答案:

答案 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,'&lt;$1');

将产生:

<p>1 &lt; 2<br/>3</p> 2 &lt; 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:问题仅适用于<符号。对于>符号,它将解析为&gt;