php - 正则表达式选择特定的 html 元素 [Curl / PHP]
问题描述
我正在尝试抓取一些特定数据并将它们输出到我的站点中。
我在 PHP 中使用 Curl,这是我尝试使用的正则表达式,但它给了我一个错误致命错误:允许的 ram 字节的内存大小耗尽,这意味着它需要很多文件。
代码:
preg_match_all('!<th scope="(\b[a-zA-Z]+\b)">(\b[a-zA-Z]+\b)<\/th><td><a href="\/wiki\/(\b[a-zA-Z]+\b)" title="(\b[a-zA-Z]+\b)">(\b[a-zA-Z]+\b)<\/a>!',$result,$cap_matches);
$cap_name = array_values(array_unique($cap_matches[0]));
echo $cap_name[0];
我试图只使正则表达式成为“a ...”标签,但我得到了很多结果,我只想抓住资本。
解决方案
不要使用正则表达式解析 HTML。 请改用适当的 HTML 解析器,例如 DOMDocument。
$domd = @DOMDocument::loadHTML ( $result );
unset($result);
$xp = new DOMXPath ( $domd );
$capital = $xp->query ( '//th[text()="Capital"]/following-sibling::td/a' )->item ( 0 )->getAttribute("title");
unset($domd,$xp);
var_dump ( $capital );
至于避免 OOM 错误,请尝试将最占用内存的操作包装在较小的函数中,让垃圾收集器在函数退出时清理所有内容,或者在不再需要大变量时尽快 unset() ..(我通常不会在上面的代码中使用 unset() ,但是由于您专门抱怨 OOM 错误,所以我这样做了)。另一个明显的解决方案是增加内存限制,例如
if(false===ini_set("memory_limit","1G")){
throw new \RuntimeException('error, unable to change memory limit!');
};
应将内存限制设置为 1 GB,高于默认的 128 MB。
推荐阅读
- xls - 如何在 kofax RPA 10.4 中打开 .xls 文件?
- spring-boot - Spring Boot Kafka - 与消费者不同的消息管理
- azure-billing-api - EA 使用计费中缺少 InvoiceId(或等效项)
- android-studio - Flutter build appbundle , debug-app.apk 工作正常,但 Flutter build apk 没有制作 apk 文件。这意味着什么?
- xml-parsing - 通过 Azure Logic 应用将 JSON 转换为 XML 格式
- import - 在verilog中,编译单元范围内的导入包和模块头之间有什么区别吗?
- selenium - 使用 Robot Framework 和 Excellibrary 将测试结果导出到 Excel
- javascript - 正则表达式 - 验证结束标签 - 模板引擎
- javascript - 使用基于 PHP 变量的 javascript 更改选择选项
- codenameone - 带有 GPS 位置标记的平面图