从网址列表中提取链接

问题描述 投票:0回答:1

我正在尝试从文本文件中的一组或 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 . "\r\n", 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');

我遇到的问题是它应该从网址列表中获取所有链接,但它只扫描第一个链接并忽略其余链接。我有 30 个链接想要从中提取,我怎样才能使上面的代码工作?

php web-scraping curl hyperlink
1个回答
0
投票

您必须在网址处使用 trim()..
尝试在代码中添加修剪

     foreach($aUrls as $sUrl) {

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

         $rPage = $this->getContents($sUrl);
         $this->getAndSaveEmails($rPage);
     }
© www.soinside.com 2019 - 2024. All rights reserved.