php - 对子项运行多个 XPath 查询还是对整个 HTML 文档运行一些 XPath 查询?(PHP)
问题描述
我想使用 DOM 解析和 XPath 抓取网站。HTML 页面有 128 个结果。
对整个 HTML 运行一个 XPath 查询然后对结果运行许多 XPath 查询是否更好:
$video_urls = $xpath->query('//div[contains(@class, "vid")]/a/@href');
foreach($videos as $video) {
$video_url = $xpath->query('./a/@href', $video)->item(0)->nodeValue;
$thumb = $xpath->query('./a/img/@src', $video)->item(0)->nodeValue;
$title = $xpath->query('./a/img/@alt', $video)->item(0)->nodeValue;
}
或者对整个 HTML 运行 4 个 XPath 查询:
$videos = $xpath->query('//div[contains(@class, "vid")]');
$video_urls = $xpath->query('//div[contains(@class, "vid")]/a/@href');
$thumbs = $xpath->query('//div[contains(@class, "vid")]/a/img/@src');
$titles = $xpath->query('//div[contains(@class, "vid")]/a/img/@alt');
解决方案
如第二个示例所示,不那么频繁地查询 DOM 应该会更快。但这并不意味着什么,最终,这取决于您的要求。我怀疑真实的单词执行时间差别不大,是吗?
但是,从您的示例中猜测,这种方法有一个问题:假设所有四个查询具有相同数量的结果,并且数组中的给定索引包含在您稍后迭代它们时从相同 DOM 元素中删除的信息。如果情况并非总是如此,这将导致各种混乱。
第一种方法可以说更容易掌握,并且可能不太容易出错,但会带来性能损失——这有关系吗?
推荐阅读
- javascript - 从被多次渲染的同一组件中收集数据到要发送到服务器的数组中
- kdb - 可以使用除kdb之外的其他时间序列数据库
- angular - Angular Unit Test - 按模块或文件夹运行
- javafx - JavaFX 一个组件窗口调整大小和子窗口自动调整大小
- linux-kernel - 如何在 yocto 中编译 linux-raspberrypi 内核?
- regex - 范围 0-200.0000 的正则表达式(包括 0 和 200)
- python - 如何获得向量。从使用 argmax 的二维 numpy 数组?
- c# - 处理第三方代码,C# 解密
- python - 如何使用 svgwrite 模块进行换行?
- php - 为什么我们要编写加载视图最后一个代码变量 codeigniter