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