2

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

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

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

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

对于男性作者的生日,对于女性作者也可以显示为

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

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

此外,解析器究竟是如何构建的?底层代码是做正则表达式,还是别的什么?如果是这样,我认为在使用解析引擎时,与快速而肮脏的正则表达式相比,性能成本会很高吗?

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

最好的问候,塞巴斯蒂安

4

1 回答 1

6

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

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

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

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

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

用于解析众所周知的HTML 格式的正则表达式很好。人们对尝试使用正则表达式解析来自许多不同来源的 HTML 感到愤怒,因为这实际上是不可能的(HTML 不是一种常规语言,您最终会遇到许多例外和矛盾)。

如果这是为了有限的使用和有限的 HTML 格式,请继续使用正则表达式。做任何对你来说更具可读性的事情。

于 2012-09-15T17:46:47.053 回答