Извлечение ссылок из списка URL-адресов

#php #curl #web-scraping #hyperlink #scrape

#php #curl #очистка веб-страниц #гиперссылка #очистить

Вопрос:

Я пытаюсь извлечь все ссылки из заданного списка или URL-адресов в текстовый файл и сохранить извлеченные ссылки в другом текстовом файле. Я пытаюсь использовать приведенный ниже скрипт, который изначально предназначался для извлечения электронных писем:

Я изменил часть извлечения электронной почты

           // preg_match_all('/([w .]*w @[w .]*w [w -w ]*.w )/is', $sPageContent, $aResults);
      
  

для извлечения ссылок, подобных этому:

           preg_match_all("/a[s] [^>]*?href[s]?=[s"'] (.*?)["'] .*?>([^<] |.*?)?</a>/is", $sPageContent, $aResults);
  

Вот полный код:

 class getEmails 

{
    const EMAIL_STORAGE_FILE = 'links.txt';

     public function __construct($sFilePath)
     {
         $aUrls = $this->getUrls($sFilePath);

         foreach($aUrls as $sUrl) {
             $rPage = $this->getContents($sUrl);
             $this->getAndSaveEmails($rPage);
         }
         $this->removeDuplicate();
     }

     protected function getAndSaveEmails($sPageContent)
     {
          // preg_match_all('/([w .]*w @[w .]*w [w -w ]*.w )/is', $sPageContent, $aResults);
          
          preg_match_all("/a[s] [^>]*?href[s]?=[s"'] (.*?)["'] .*?>([^<] |.*?)?</a>/is", $sPageContent, $aResults);

         foreach($aResults[1] as $sCurrentEmail) {
             file_put_contents(self::EMAIL_STORAGE_FILE, $sCurrentEmail . "rn", FILE_APPEND);
         }
     }

     protected function getContents($sUrl)
     {
         if (function_exists('curl_init')) {
            $rCh = curl_init();
            curl_setopt($rCh, CURLOPT_URL, $sUrl);
            curl_setopt($rCh, CURLOPT_HEADER, 0);
            curl_setopt($rCh, CURLOPT_RETURNTRANSFER, 1);
            curl_setopt($rCh, CURLOPT_FOLLOWLOCATION, 1);
            $mResult = curl_exec($rCh);
            curl_close($rCh);
            unset($rCh);
            return $mResult;
        } else {
            return file_get_contents($sUrl);
        }
     }

     protected function getUrls($sFilePath)
     {
         return file($sFilePath);
     }

     protected function removeDuplicate()
     {
         $aEmails = file(self::EMAIL_STORAGE_FILE);
         $aEmails = array_unique($aEmails);
         file_put_contents(self::EMAIL_STORAGE_FILE, implode('', $aEmails));
     }
}

new getEmails('sitemap_index.txt');
  

Проблема, с которой я сталкиваюсь, заключается в том, что предполагается, что он получает все ссылки из списка URL-адресов, но он сканирует только первую ссылку и игнорирует остальные. У меня есть 30 ссылок, из которых я хочу извлечь, как я могу заставить приведенный выше код работать?

Комментарии:

1. У вас есть пример строки?

Ответ №1:

вы должны использовать trim() для URL-адреса..
попробуйте добавить обрезку в свой код

      foreach($aUrls as $sUrl) {

         $sUrl=trim($sUrl); //this

         $rPage = $this->getContents($sUrl);
         $this->getAndSaveEmails($rPage);
     }