简单DOM解析器插入到数据库

简单DOM解析器插入到数据库

问题描述:

我想在数据库中插入一些元素,但我想,$ pavadinimas和%凯纳在一条线,没有什么不同。此外,如果我可以在网站的所有页面中生成我的元素,那么它将会非常酷,但是当我插入2个以上的链接时,我会刷新网页无法加载的错误。这是我的代码。感谢帮助!简单DOM解析器插入到数据库

<?php // example of how to modify HTML contents 


include_once('simple_html_dom.php'); 

// Create DOM from URL or file 

$html = file_get_html('https://www.varle.lt/mobilieji-telefonai/'); 

foreach($html->find('span[class=inner]') as $pavadinimas) { 
    $pavadinimas = str_replace("<span class=", " ", $pavadinimas); 
    $pavadinimas = str_replace("inner>", " ", $pavadinimas); 
    $pavadinimas = str_replace("<span>", " ", $pavadinimas); 
    $pavadinimas = str_replace("</span></span>", " ", $pavadinimas); 
    $pavadinimas = str_replace('"inner"> ', " ", $pavadinimas); 
} 

foreach($html->find('span[class=price]') as $kaina) { 
    $kaina = str_replace("Lt", " ", $kaina); 
    $kaina = str_replace("<span class=", " ", $kaina); 
    $kaina = str_replace("price", " ", $kaina); 
    $kaina = str_replace("</span>", " ", $kaina); 
    $kaina = str_replace(",<sup>99</sup>", " ", $kaina); 
    $kaina = str_replace(",<sup>99</sup>", " ", $kaina); 
    $kaina = str_replace("    ", " ", $kaina); 
    $kaina = str_replace('" ">', " ", $kaina); 
    $kaina = str_replace("    ", " ", $kaina); 
    $query = "insert into telefonai (pavadinimas,kaina) VALUES (?,?)"; 
    $this->db->query($query, array($pavadinimas,$kaina)); 
} 
?> 
+0

您可以在您的问题中使用更多标签。也许PHP por exmaple。这样,更多的人会阅读它并可能帮助你。 – Gonzalo

+0

使用'str_replace'是浪费时间,因为您可以使用'$ pavadinimas-> plaintext'轻松获取标签的内容...请检查[Manual](http://simplehtmldom.sourceforge.net/manual。 htm)查看详细信息... [已发布] – Enissay

通过从一个页面(第1为例)得到所有想要的信息按部就班......

开始......我们的想法是:

  • 获取所有电话块:$phones = $html->find('a[data-id]');
  • 在一个循环中,得到每个块
  • 想要的信息(名称,价格)在db插入这些信息(我不能用分贝帮助,因为我没有使用一期一会,BU T优能做到这一点你自己也并不难)

现在,你的代码对于一个页面的工作,让我们尽量做到所有网页的工作知道:

  • 所有页面具有相同的结构,所以我们可以用上面
  • 下一页刮包含在Next按钮的链接相同的方法/代码中提取数据,所以我们会停下来时,这个链接无法找到

So h ERE是总结了所有我们上面说了代码:

$url = "https://www.varle.lt/mobilieji-telefonai/"; 

// Start from the main page 
$nextLink = $url; 

// Loop on each next Link as long as it exsists 
while ($nextLink) { 
    echo "<hr>nextLink: $nextLink<br>"; 
    //Create a DOM object 
    $html = new simple_html_dom(); 
    // Load HTML from a url 
    $html->load_file($nextLink); 

    ///////////////////////////////////////////////////////////// 
    /// Get phone blocks and extract info (also insert to db) /// 
    ///////////////////////////////////////////////////////////// 
    $phones = $html->find('a[data-id]'); 

    foreach($phones as $phone) { 
     // Get the link 
     $linkas = $phone->href; 

     // Get the name 
     $pavadinimas = $phone->find('span[class=inner]', 0)->plaintext; 

     // Get the name price and extract the useful part using regex 
     $kaina = $phone->find('span[class=price]', 0)->plaintext; 
     // This captures the integer part of decimal numbers: In "123,45" will capture "123"... Use @([\d,]+),[email protected] to capture the decimal part too 
     preg_match('@(\d+),[email protected]', $kaina, $matches); 
     $kaina = $matches[1]; 

     echo $pavadinimas, " #----# ", $kaina, " #----# ", $linkas, "<br>"; 

     // INSERT INTO DB HERE 
     // CODE 
     // ... 
    } 
    ///////////////////////////////////////////////////////////// 
    ///////////////////////////////////////////////////////////// 

    // Extract the next link, if not found return NULL 
    $nextLink = (($temp = $html->find('div.pagination a[class="next"]', 0)) ? "https://www.varle.lt".$temp->href : NULL); 

    // Clear DOM object 
    $html->clear(); 
    unset($html); 
} 

输出

nextLink: https://www.varle.lt/mobilieji-telefonai/ 
Samsung Phone I9300 Galaxy SIII Juodas #----# 1099 #----# https://www.varle.lt/mobilieji-telefonai/samsung-phone-i9300-galaxy-siii-juodas.html 
Samsung Galaxy S2 Plus I9105 Pilkai mėlynas #----# 739 #----# https://www.varle.lt/mobilieji-telefonai/samsung-galaxy-s2-plus-i9105-pilkai-melynas.html 
Samsung Phone S7562 Galaxy S Duos baltas #----# 555 #----# https://www.varle.lt/mobilieji-telefonai/samsung-phone-s7562-galaxy-s-duos-baltas--457135.html 
... 

nextLink: https://www.varle.lt/mobilieji-telefonai/?p=2 
LG T375 Mobile Phone Black #----# 218 #----# https://www.varle.lt/mobilieji-telefonai/lg-t375-mobile-phone-black.html 
Samsung S6802 Galaxy Ace Duos black #----# 579 #----# https://www.varle.lt/mobilieji-telefonai/samsung-s6802-galaxy-ace-duos-black.html 
Mobilus telefonas Samsung Galaxy Ace Onyx Black | S5830 #----# 559 #----# https://www.varle.lt/mobilieji-telefonai/mobilus-telefonas-samsung-galaxy-ace-onyx-black.html 
... 

... 
... 

Working DEMO

注意该代码可能需要一段时间来分析所有的网页,所以php可能会返回这个错误Fatal error: Maximum execution time of 30 seconds exceeded ...。然后,简单地延长这样的最大执行时间:

ini_set('max_execution_time', 300); //300 seconds = 5 minutes 
+0

非常感谢,您的回答安全我的搜寻千小时。 – Mangirdas

+0

@ user3125624,不客气。如果解决您的问题,请注明答案接受... – Enissay