我有这个链接:Alchemilla vulgaris。
这是关于某种草药的图片的谷歌图片链接,我想在此网页的代码中搜索具有属性 <div>
的 data-id
标签,并使用 {{1} 提取 data id
}.
我有这个代码,但它没有显示任何结果。我认为问题在于正则表达式。你能帮我把它弄好吗。
preg_match_all
谢谢
答案 0 :(得分:1)
如果您还没有看过这个https://stackoverflow.com/a/1732454/4907162
是的,正如评论中指出的那样,真正的 DOM/XML parser 会更合适。也有 regex has a time and place for its usage ... HTML parsing with regex really isn't the best thing 但当然可以做一些事情。
需要注意的几点:
Google 不喜欢机器人抓取它 - 如果您看起来像机器人,您甚至可能会被要求解决 (re-)?captcha
。所以此时(未来可能会改变?)如果您的User-Agent
与已知的“友好”不匹配,则UA
你被过滤掉并得到一个不同的 HTML 结果。我敢肯定,您可能已经执行了 echo $html;
只是为了看到您正在获取内容,但是如果您手动搜索,您将看到生成的数据不包含您的 data-id
字符串正在努力寻找。
因此,对于您使用 PHP 函数 file_get_contents
的情况,您需要执行以下操作:
$opts = array('http' =>
array(
'header' => 'User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.67'
)
);
$context = stream_context_create($opts);
$html = file_get_contents( $url, false, $context );
对于正则表达式,这是一个小改动:
preg_match_all('#<div\s[^>]*?(?:data-id=[\'"](.*?)[\'"]).*?>#is',$html, $matches );
当我试图简单地让脚本工作时,如果您想以另一种方式查看,我最终创建了这个正则表达式。
preg_match_all('#<div\s+[^>]+data-id=[\'"]([^\'"]+)[\'"][^>]*>#is', $html, $matches )
Tim Toady 碳酸氢盐
以我能找到的方式回答您的评论 - 也许其他人可以详细说明:
在 PHP 中,提供给 file_get_contents 的上下文允许添加附加信息以从 HTTP/URL 调用信息。
如果您要在您拥有的服务器的 URL 上测试 file_get_contents,您可能会注意到日志中的 User-Agent 为空。至少在我使用的服务器上,用户代理是一个空字符串。 context 允许指定传递给您尝试从中提取数据的服务器的用户代理。
您从中提取数据的服务器处理其余信息。在从 Google 呼叫信息的情况下 - 他们会检查用户代理信息。您会想要使用“已知友好”(我称之为)用户代理。
流的上下文允许提供服务器希望看到的信息。或者至少这就是我可以在文件/url资源的上下文中为 PHP 描述的内容阅读.
我希望这会有所帮助。我承认我不知道如何回复更有用的信息。