【问题标题】:php : how to get all hyperlinks from a specific div of a given page?php:如何从给定页面的特定 div 中获取所有超链接?
【发布时间】:2016-11-18 10:29:30
【问题描述】:

我正在尝试从这个网络获取一些div 上的所有新闻链接 URL

要获取所有链接,在我查看源代码后什么都没有。

但是有什么数据显示

有知道PHPArray()JS的人可以帮帮我吗?

这是我获取内容的代码:

$html = file_get_contents("https://qc.yahoo.com/");
if ($result === FALSE) {
    die("?");
} 
echo $html;

【问题讨论】:

  • 我很难理解。如果您向我们展示了一个示例 $html 输入,以及您在完成处理后希望拥有的内容,将会有所帮助。只是一个小样本,足以让我们了解您想要做什么。
  • 你的@BeetleJuice 让你检查stackoverflow.com/a/38396700/6516181 我的意思,对不起,我在编码和关键字名称方面没有进步。请大家帮忙^^

标签: javascript php


【解决方案1】:
$html = new DOMDocument();
@$html->loadHtmlFile('https://qc.yahoo.com/');
$xpath = new DOMXPath( $html );
$nodelist = $xpath->query( "//div[@id='news_moreTopStories']//a/@href" );
foreach ($nodelist as $n){
echo $n->nodeValue."\n";
}

您可以从您指定的 div 中获取所有链接。确保将 div id 放入 id='news_moreTopStories']。您正在使用 xpath 来查询 div。您不需要大量代码,只需要这一部分。

http://php.net/manual/en/class.domxpath.php

【讨论】:

  • 先生,谢谢你也帮助我们,这将为我添加更多解决方案^^
  • 是的,这是一个更好的解决方案,但它似乎无法解码 gzip 格式的内容。
【解决方案2】:

假设您想从给定页面中提取所有 Anchor 标签及其超链接。

现在在该 URL 上执行 file_get_contents 会出现某些问题:

  1. 压缩的字符编码,即gzip
  2. URL 的 SSL 验证。

因此,为了克服gzip 字符编码的第一个问题,我们将按照@gregn3 在他的回答中建议的那样使用CURL。但他错过了使用 CURL 自动解压缩gziped 内容的能力。

对于第二个问题,您可以遵循 this 指南或通过 CURL 的 curl_setopt 方法禁用 SSL 验证。

现在将从给定页面中提取所有链接的代码是:

<?php

$url = "https://qc.yahoo.com/";

# download resource
$c = curl_init ($url);
curl_setopt($c, CURLOPT_HTTPHEADER, ["Accept-Encoding:gzip"]);
curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_FOLLOWLOCATION, 1); 
curl_setopt($c, CURLOPT_ENCODING , "gzip");
curl_setopt($c, CURLOPT_VERBOSE, 1);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, 0);
$content = curl_exec ($c);

curl_close ($c);

$links = preg_match_all ("/href=\"([^\"]+)\"/i", $content, $matches);

# output results
echo "url = " . htmlspecialchars ($url) . "<br>";
echo "links found (" . count ($matches[1]) . "):" . "<br>";
$n = 0;
foreach ($matches[1] as $link)
{
    $n++;
    echo "$n: " . htmlspecialchars ($link) . "<br>";
}

但是如果你想进行高级 html 解析,那么你需要使用PHP Simple HTML Dom Parser。在 PHP Simple HTML Dom 中,您可以使用 jQuery 选择器选择 div 并获取 anchor tags。这是documentation & api manual

【讨论】:

  • 感谢@Deepak,我对 CURL 不是很熟悉,但现在我也知道了。 :)
  • 不,我喜欢这个。这让我更明白。谢谢你的描述和知识先生:*亲吻拥抱.. #awesome btw 你有什么东西,我想加你先生
  • :) 抱歉,我不知道 socmed 是什么。
  • @DeepakChaudhary 社交媒体先生.. :3
  • 啊.. :D 我在 socmed 上不是很活跃。
【解决方案3】:

要查找 HTML 中的所有链接,您可以使用 preg_match_all()。

$links = preg_match_all ("/href=\"([^\"]+)\"/i", $content, $matches);

那个 url https://qc.yahoo.com/ 使用 gzip 压缩,所以你必须检测它并使用函数 gzdecode() 解压缩它。 (它必须安装在你的 PHP 版本中)

gzip 压缩由Content-Encoding: gzip HTTP 标头指示。您必须检查该标头,因此您必须使用 curl 或类似方法来检索标头。 (file_get_contents() 不会为您提供 HTTP 标头...它仅下载 gzip 压缩内容。您需要检测它是否已压缩,但为此您需要阅读标头。)

这是一个完整的例子:

<?php

$url = "https://qc.yahoo.com/";

# download resource
$c = curl_init ($url);
curl_setopt ($c, CURLOPT_HEADER, true);
curl_setopt ($c, CURLOPT_RETURNTRANSFER, true);
$content = curl_exec ($c);
$hsize = curl_getinfo ($c, CURLINFO_HEADER_SIZE);
curl_close ($c);

# separate headers from content
$headers = substr ($content, 0, $hsize);
$content = substr ($content, $hsize);

# check if content is compressed with gzip
$gzip = 0;
$headers = preg_split ('/\r?\n/', $headers);
foreach ($headers as $h)
{
    $pieces = preg_split ("/:/", $h, 2);
    $pieces2 = (count ($pieces) > 1);
    $enc = $pieces2 && (preg_match ("/content-encoding/i", $pieces[0]) );
    $gz = $pieces2 && (preg_match ("/gzip/i", $pieces[1]) );
    if ($enc && $gz)
    {
        $gzip = 1;
        break;
    }
}

# unzip content if gzipped
if ($gzip)
{
    $content = gzdecode ($content);
}


# find links
$links = preg_match_all ("/href=\"([^\"]+)\"/i", $content, $matches);

# output results
echo "url = " . htmlspecialchars ($url) . "<br>";
echo "links found (" . count ($matches[1]) . "):" . "<br>";
$n = 0;
foreach ($matches[1] as $link)
{
    $n++;
    echo "$n: " . htmlspecialchars ($link) . "<br>";
}

【讨论】:

  • hy @gregn3 感谢您理解我的帖子,我不知道关键字,使用您的代码后,我得到了 eroor,在这里我检查了我的 php 5.6.23,gzdecode OK,zlib 扩展加载,但是 PHP 致命错误:调用未定义的函数 gzip_inflate() 生成.. 为什么?请您的帮助。
  • 顺便说一句对不起,我想放弃投票之前但是感谢您的反馈!声望低于 15 人的投票会被记录,但不要更改公开显示的帖子分数#myrputation is bad T.T
  • 例如,如果我打开原始网站,则有 10 个链接。 但是当我卷曲网站时,它们只显示 5 个链接.. 如何显示所有链接?
  • @ane 您好,要获取页面上的所有链接,您可以尝试调整使用的正则表达式。也许这与所有这些都不匹配:"/href=\"([^\"]+)\"/i"
  • 然后添加 curl 选项curl_setopt($c, CURLOPT_ENCODING , "gzip"); 将完成任务。之后,curl 自己会解压响应。
猜你喜欢
  • 2020-02-29
  • 1970-01-01
  • 2016-02-03
  • 2021-09-29
  • 2014-01-21
  • 1970-01-01
  • 2023-03-30
  • 2019-07-01
  • 2021-11-30
相关资源
最近更新 更多