我正在寻找一种方法来查找网页中行的标题。
使用 Puppeteer,如果我知道div和类的名称,我可以找到行的标题。但是如果我不知道呢?如果我想获取任何列表的所有标题,该怎么办?
我不是在寻找一个完整的解决方案(如果有,那更好),但即使是一个关于我可以使用什么技术的想法(可能是某种AI)来达到这个输出也行。
示例:
输出:
- Sekiro: Shadows Die Twice
- Mortal Kombat 11
- F1 2019
- Outer Wilds
回答:
监督学习
如果你指的是像监督学习AI系统(如神经网络)这样的东西,我想给你一个关于你将要面对的问题的想法。有三个主要问题:
训练数据
要创建一个自动检测标题的AI,你首先需要训练AI。你需要数百个,可能数千个样本来训练你的AI。这意味着,在你的AI能够预测任何东西之前,你必须投入大量的手动工作来获取和标记输入数据。
AI的输入
你会给AI什么作为输入?你有两个选择:
- 源代码:这基本上是训练你的AI成为一个网页浏览器。有趣的挑战,但我怀疑你不会从中得到任何结果。
- 网站的屏幕截图?你不应该将实际的截图输入到AI中,而是尝试“清理”它。例如,你可以用某种占位符替换所有文本,因为你希望你的AI基于“文档的外观”而不是文本本身来工作。这种方法比第一种方法更有效,但你需要在将图像提供给AI之前对其进行一些清理工作。这可能有效,但你需要大量的训练数据才能可靠地工作。
可靠性
即使你解决了所有问题,你的AI最终能够检测列表的标题,你也需要意识到AI永远不会完美工作。当然,没有任何算法是完美的,但使用AI,你不能简单地“调整”你的算法来获得更好的结果。
想象一下,你发现对于某个特定的网站,你的AI不起作用。你不能轻易地调试你的AI并调整你的代码以使其适用于那个页面。你将不得不重新训练你的AI,希望在你的调整之后它会工作。也许,然后它会适用于那个页面,但现在另一个网站将不再工作…
算法方法
我建议使用一个简单的算法来检测带有标题元素的列表,而不是使用AI。以下类似的东西可能有效:
对每个标题标签(h2
、h3
等)重复以下步骤
- 获取所有标题元素(例如
h2
) - 如果元素数量 <= 1,则这不是列表(跳过)
- 检查每个元素的“周围元素”。如果这是一个列表,所有元素应该有相同的周围环境:元素的父级是否有相同的类名?兄弟节点是否有相同的类?如果不是,这不是列表(跳过)
- 根据前面的步骤,这些元素很可能是一个列表的一部分,你的标题元素应该包含列表的标题。
有一些明显的缺点:这种方法只适用于超过一个元素的列表,并且仅在正确使用标记时有效。如果网站只使用 div
元素而不是标题标签,这将不起作用。因此,这应该只是一个起点,显然可以改进这个算法…