正则表达式与解析引擎

时间:2012-09-15 17:38:51

标签: regex html-parsing

您好我正在构建一个关于我的图书集的事实数据的数据库,即标题,页数,宽度,长度,作者,作者出生日期,出版商名称,出版商地址等。 为此,我输入了ISBN,应用程序从Web获取该信息。从我自己定义的几个网站中,我知道其中包含我需要的所有信息。目前,这是3个站点,很可能永远不会超过5个站点。在每个网站上,我CURL一个搜索页面,其中isbn作为查询参数,提取搜索页面显示的链接,然后CURL这些链接并提取上述信息(出生,标题,出版商等...)他们。 因此,我的抓取范围是3 x(搜索页面+信息页面)= 6个HTML页面。

这些页面都以荒唐的方式呈现相关信息。例如,发布者信息在一个HTML标记中包含地址,电话,电子邮件,网站,其中brs为分隔符。有些发布商没有这些字段中的一个,因此它甚至不总是相同数量的brs。 这些网站中的另一个对于大多数信息都有lis,但是对于一个字段,p为另一个字段,而div为另一个字段。 等...

我已经成功地使用正则表达式提取了我想要的内容,然后使用DOM解析器。最后,DOM解析器的代码可读性更差,因为需要更多操作来提取信息字段。举个例子:

<li>Né le : 23/12/1990 (ANGLETERRE)</li>

对于男性作者的出生日期,也可以出现在女性作者中

<li>Née le : 11/07/1832</li>

使用DOM解析器,我需要获取lis列表,这是不够的,因为一些重要信息在p,div和a中。然后对于每个li,我需要检查li是否包含“Néle”或“Néele”,这是ifs还是正则表达式 - 检查是否有一个括号出生地,并提取它,即至少两个以上的行动。 使用正则表达式,我可以在一行代码中得到它。

此外,解析器究竟是如何构建的?底层代码是否有正则表达式,还是其他的?如果是这样的话,我认为使用解析引擎与快速和脏的正则表达式相比,性能成本很高?

所以这是我的两个询问,如何构建DOM解析器,它是否具有底层正则表达式?其次,由于我解析六到十页的范围非常有限,主要是供我个人使用,我不应该考虑代码的可读性(而且性能取决于第一个问题)?

祝你好运, 塞巴斯蒂安

1 个答案:

答案 0 :(得分:6)

  

如何构建DOM解析器,它是否具有底层正则表达式?

它是一个解析器,通常不会使用正则表达式实现。在内部,人们会在时间点遍历HTML的每个字符,并使用state machine来“弄清楚”字符的含义以及它如何适合DOM(这将包括修复损坏的HTML,关闭应该是的元素关闭等等)。

如果您可以阅读C#(或Java),我建议您阅读HTML Agility Pack的源代码 - 特别是Parse方法。它将非常清楚地表明这是如何完成的。

如何正确解析HTML的明确来源是whatwg HTML规范的section 12.2 - (请注意,该链接仅指向第一个页面- 还有更多)。这不是为了佯装;)

  

对于我解析六到十页的非常有限的范围,主要是供我个人使用,我不应该考虑代码可读性(并且性能取决于第一个问题)?

解析众所周知的 HTML格式的正则表达式很好。人们反对尝试使用正则表达式解析来自许多不同来源的HTML,因为这实际上是不可能的(HTML不是常规语言,最终会出现许多异常和矛盾)。

如果这是限量使用和有限的HTML格式,请继续使用正则表达式。做任何更易读的事情。

相关问题