【问题标题】:Parsing lower than symbol with nodejs and cheerio使用nodejs和cheerio解析低于符号
【发布时间】:2015-09-01 16:30:00
【问题描述】:

我正在尝试解析包含低于符号的数字数据,如下所示:

<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,但没有成功

如何正确获取值?

谢谢。

【问题讨论】:

    标签: node.js parsing cheerio


    【解决方案1】:

    您看到此内容的原因是,就 HTML 而言,裸露的 &lt; 是一个非法字符,这将对 Cheerio 造成很大的伤害,因为它希望其输入是明确定义的。

    (虽然您可能认为这应该会导致浏览器无法呈现页面,但"official" HTML specification 建议浏览器应该尽可能容忍“格式错误”的输入。)

    解决此问题的一种方法是通过正则表达式运行您的内容以正确转换所有裸&lt;(之前出现的那些正确的HTML实体:'

    // 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 标志添加到正则表达式会使其运行次数与模式匹配内容的次数一样多。

    【讨论】:

    • 我还要注意,在您的示例 HTML 中,裸露的“非常过时的理解生成的。
    【解决方案2】:

    github 中有一个开放的issue 用于解析 html 的自定义选项。预计未来。

    解决方法:

    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: 问题仅针对&lt; 符号。对于&amp;gt; 符号,它将解析为&amp;gt;

    【讨论】:

      猜你喜欢
      • 2018-05-29
      • 1970-01-01
      • 2013-03-06
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 2017-12-01
      • 2015-09-22
      • 1970-01-01
      相关资源
      最近更新 更多