【问题标题】:Parse broken HTML Code using Nodejs & Cheerio使用 Node Js 和 Cheerio 解析损坏的 HTML 代码
【发布时间】:2013-08-09 18:18:53
【问题描述】:

我正在尝试使用 Nodejs 和 Cheerio 抓取带有表格数据的纯静态 html 页面。但问题是,该页面正在尝试抓取没有正确的 HTML DOM。我的意思是,有许多未关闭的开始标签。还有其他没有开口的结束标签(</table>)。

示例代码(警告:代码与真实示例接近,html 已损坏)

  <body topmargin="0" leftmargin="0" marginheight="0" marginwidth="0" bgcolor="#FFFFFF" text="#000000" link="#003399" vlink="#003399" alink="#FF8000">
    <table border="0" cellpadding="0" cellspacing="0" width="100%">
        <tr><td bgcolor="#445BC6">hii</td></tr>
        <tr><td></td></tr>
        <tr>
            <td align="right" bgcolor="#D9D9E8" width="100%">
                <p class="menu"><b><font color="#000000"><a href="details.php?type=contact&npo_id=18430">Individuals</a></font></b>&nbsp;&nbsp;
            </td>
        </tr>
    </table>
    <P>
    <TABLE CELLPADDING=8><TR><TD>&nbsp;</TD><TD>
                <TABLE CELLPADDING=8 STYLE="border-collapse: collapse" BORDER=1 WIDTH=80% ALIGN=cemter>

                    <TR><TD BGCOLOR="D8D8C4" VALIGN=top ALIGN=right><P><B>Data 1</B></TD>
                        <TD><P><B>Data 2</B></TD>
                    </TR>
                    <TR><TD BGCOLOR="D8D8C4" VALIGN=top ALIGN=right><P><B>Data 3</B></TD>
                        <TD><P>Data 4</TD>
                    </TR>


                </TABLE>
            </TD></TR></TABLE>            <tr>
    <td width="100%" valign="bottom" colspan="2" align="center">
        <p>
            <a href="#top">another dirty content</a><br>
            <a href="#top"><font color="#000000">table is wrong</font></a></p>
    </td>
</tr></table></div>

 

正如人们所看到的,有 P 标签没有关闭。在底部有 &lt;/table&gt; & &lt;/div&gt; 未打开的标签。 那么如何使用cheerio 和 nodejs 获取 Data1、Data2、Data3、Data4 呢?任何其他库也可以有效地解析此类数据

编辑(解决方案):问题已解决。我所做的只是将 html 标签转换为小写,它工作得很好。我不确定为什么小写很重要,但它只适用于cheerio

【问题讨论】:

  • 用正则表达式抓取并不难,尤其是在页面都具有相似格式的情况下。这里:pastebin.com/SRDYBxpX 是一个用 python 编写的示例,用于抓取 piratebay。正则表达式具有明显的优势,它们可以忽略关闭和打开标签的任何问题。并且您可以使用包含所需数据的标签来安全地界定给定正则表达式将捕获的内容。

标签: node.js web-scraping cheerio


【解决方案1】:

cheerio 是围绕htmlparser2 构建的,这应该是“宽容的”。如果它不解析您的页面,并且我知道这违反了传统观念,我会使用正则表达式进行解析。这是假设页面结构不会发生太大变化,并且只是您尝试解析的那一页。

另外,我注意到您的示例 HTML 顶部有一个指向 individuals.php 的链接。您所追求的数据能否以不同的、更可解析的格式存在?

哦,在抓取时尊重人们的隐私和网站使用条款。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-05-29
    • 2015-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多