正则表达式与解析引擎

pou*_*ler 2 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>
Run Code Online (Sandbox Code Playgroud)

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

<li>Née le : 11/07/1832</li>
Run Code Online (Sandbox Code Playgroud)

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

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

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

此致,塞巴斯蒂安

Ode*_*ded 6

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

它是一个解析器,通常不会使用正则表达式实现.在内部,人们会在时间浏览HTML的每个字符,并使用状态机 "弄清楚"字符的含义以及它如何适合DOM(这将包括修复损坏的HTML,关闭应该关闭的元素等等).

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

有关如何正确解析HTML 的确切来源是whatwg HTML规范的第12.2节 - (请注意,该链接仅指向第一页 - 还有更多内容).这不是为了佯攻;)

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

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

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