【问题标题】:regex to choose specific html elements [Curl / PHP]正则表达式选择特定的 html 元素 [Curl / PHP]
【发布时间】:2018-05-21 19:54:59
【问题描述】:

我正在尝试抓取一些特定数据并将它们输出到我的站点中。

我在 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 ...”标签的正则表达式,但我得到了很多结果,我只想抓住资本。

【问题讨论】:

  • 你尝试过使用 PHP Xpaths 吗?
  • 您必须发布代码才能获取 URL 内容,这是该错误的原因。
  • @dGRAMOP 不,我没有,但我现在就去看看。
  • @AbraCadaver 我知道使用正则表达式我无法解析 html 标签等。但是对于使用正则表达式的特定示例有什么解决方案吗?

标签: php html regex curl


【解决方案1】:

do not parse HTML with regex. 使用适当的 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。

【讨论】:

    猜你喜欢
    • 2011-12-18
    • 1970-01-01
    • 2018-11-24
    • 1970-01-01
    • 2014-02-14
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2011-11-03
    相关资源
    最近更新 更多