Не могу разобрать названия некоторых ссылок, используя функцию - PullRequest
0 голосов
/ 15 сентября 2018

Я написал скрипт для анализа заголовка каждой страницы после использования ссылок, заполненных этим url .Чтобы быть более понятным: мой скрипт ниже должен проанализировать все ссылки с целевой страницы, а затем повторно использовать эти ссылки, чтобы пройти один уровень и проанализировать названия сообщений оттуда.

Поскольку это мой первыйкогда-либо пытаясь что-то написать в 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);
?>

Когда я выполняю скрипт, он выдает следующую ошибку:

Warning: file_get_contents(https://stackoverflow.com/questions/52347029/getting-all-the-image-urls-from-a-given-instagram-user<br> https://stackoverflow.com/questions/52346719/unable-to-print-links-in-another-function<br> https://stackoverflow.com/questions/52346308/bypassing-technical-limitations-of-instagram-bulk-scraping<br> https://stackoverflow.com/questions/52346159/pulling-the-href-from-a-link-when-web-scraping-using-python<br> https://stackoverflow.com/questions/52346062/in-url-is-indicated-as-query-or-parameter-in-an-attempt-to-scrap-data-using<br> https://stackoverflow.com/questions/52345850/not-able-to-print-link-from-beautifulsoup-for-web-scrapping<br> https://stackoverflow.com/questions/52344564/web-scraping-data-that-was-shown-previously<br> https://stackoverflow.com/questions/52344305/trying-to-encode-decode-locations-when-scraping-a-website<br> https://stackoverflow.com/questions/52343297/cant-parse-the-titles-of-some-links-using-function<br> https: in C:\xampp\htdocs\differenttuts\simple_html_dom.php on line 75

Fatal error: Uncaught Error: Call to a member function find() on boolean in C:\xampp\htdocs\differenttuts\testfile.php:18 Stack trace: #0 C:\xampp\htdocs\differenttuts\testfile.php(23): reuse_links('https://stackov...') #1 {main} thrown in C:\xampp\htdocs\differenttuts\testfile.php on line 18

Еще раз: я ожидаю, что мой сценарий получит ссылки с целевой страницы и проанализирует заголовки с целевой страницы.

1 Ответ

0 голосов
/ 15 сентября 2018

Я не очень знаком с 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);

Я думаю, что имеет смысл использовать основной URL в качестве параметра в get_links, мы можем получить из него базовый URL. Я использовал функции массива для базового URL, но вы могли бы использовать parse_url, который является подходящей функцией.

...