无法使用功能解析某些链接的标题

时间:2018-09-15 09:07:07

标签: php web-scraping simple-html-dom

在编写了一个脚本之后,我使用了从此url填充的链接来解析每个页面的标题。更清楚地说:我的以下脚本应该解析着陆页上的所有链接,然后重用这些链接以深入一层并从此处解析帖子的标题。

因为这是我第一次尝试在let o = { a: 1, b: 2 }; //won't print o but changes o.a to 3 console.log(o.a = 3);中编写任何内容,所以我无法弄清楚哪里出了问题。

这是我到目前为止的尝试:

php

当我执行脚本时,它会产生以下错误:

<?php
include("simple_html_dom.php");
$baseurl = "https://stackoverflow.com";
function get_links($baseurl)
{
    $weburl = "https://stackoverflow.com/questions/tagged/web-scraping";
    $html   = file_get_html($weburl);
    $processed_links = array();
    foreach ($html->find(".summary h3 a") as $a) {
            $links           = $a->href . '<br>';
            $processed_links[] = $baseurl . $links;

        }
        return implode("\n",$processed_links);
}
function reuse_links($processed_links){
    $ihtml = file_get_html($processed_links);
    foreach ($ihtml -> find("h1 a") as $item) {
        echo $item->innertext;
    }
}
$pro_links = get_links($baseurl);
reuse_links($pro_links);
?>
  

再一次:我希望我的脚本在目标网页上定位链接,并从目标页面解析标题。

1 个答案:

答案 0 :(得分:2)

我对simple_html_dom不太熟悉,但是我会尽力回答这个问题。该库使用file_get_contents来执行HTTP请求,但是在PHP7中,file_get_contents在检索网络资源时不接受负偏移量(这是该库的默认值)。

如果您使用的是PHP 7,则应将偏移量设置为0。

$html = file_get_html($url, false, null, 0);

在您的get_links函数中,将链接链接到一个字符串。我认为最好返回一个数组,因为在下一个函数中,新的HTTP请求将需要这些链接。出于同样的原因,您不应该在链接中添加中断标签,因此打印时可能会中断。

function get_links($url)
{
    $processed_links  = array();
    $base_url = implode("/", array_slice(explode("/", $url), 0, 3));
    $html = file_get_html($url, false, null, 0);
    foreach ($html->find(".summary h3 a") as $a) {
        $link = $base_url . $a->href;
        $processed_links[] = $link;
        echo $link . "<br>\n";
    }
    return $processed_links ;
}

function reuse_links($processed_links)
{
    foreach ($processed_links as $link) {
        $ihtml = file_get_html($link, false, null, 0);
        foreach ($ihtml -> find("h1 a") as $item) {
            echo $item->innertext . "<br>\n";
        }
    }
}

$url = "https://stackoverflow.com/questions/tagged/web-scraping";
$pro_links = get_links($url);
reuse_links($pro_links);

我认为在get_links中使用主URL作为参数更有意义,我们可以从中获取基本URL。我已经将数组函数用于基本url,但是可以使用parse_url这是合适的函数。