PHP-Dom-Processing:一个小的Parser程序的代码审查

时间:2011-06-04 08:01:29

标签: php mysql parsing dom curl

非常感谢您运行此主板。我喜欢这个网站。它经常帮助我!你是伟大的伙伴。我今天做的是在一个小的PHP解析器上工作!

我需要从该网站获取所有数据。查看目标:www​​.aktive-buergerschaft.de/buergerstiftungen/unsere_leistungen/buergerstiftungsfinder 我试图从网页上抓取数据,但我需要获取此链接中的所有数据。 我想将数据存储在Mysql-db中以便更好地检索!

看一个例子:

我需要从该网站获取所有数据。

查看目标:see this link here: Foundations in Germany - click here

我正在尝试从网页上抓取数据,但我需要获取此链接中的所有数据。

看一个例子:

Bürgerstiftung Lebensraum Aachen
    rechtsfähige Stiftung des bürgerlichen Rechts
    Ansprechpartner: Hubert Schramm
    Alexanderstr. 69/ 71
    52062 Aachen
    Telefon: 0241 - 4500130
    Telefax: 0241 - 4500131
    Email: info@buergerstiftung-aachen.de
    www.buergerstiftung-aachen.de
    >> Weitere Details zu dieser Stiftung

Bürgerstiftung Achim
    rechtsfähige Stiftung des bürgerlichen Rechts
    Ansprechpartner: Helga Kühn
    Rotkehlchenstr. 72
    28832 Achim
    Telefon: 04202-84981
    Telefax: 04202-955210
    Email: info@buergerstiftung-achim.de
    www.buergerstiftung-achim.de
    >> Weitere Details zu dieser Stiftung 

我需要拥有链接“后面”的数据 - 有没有办法做到这一点 一个简单易懂的解析器 - 一个可以被新手理解和编写的解析器!? 好吧,我可以用XPahts做这个 - 用PHP或Perl - (用机械化)

我开始使用php方法:但是 - 如果我运行代码(见下文),我会得到这个结果

PHP Fatal error:  Call to undefined function file_get_html() in /home/martin/perl/foundations/arbie_finder_de.php on line 5
martin@suse-linux:~/perl/foundations> cd foundations

由此代码引起的

<?php

// Create DOM from URL or file
$html = file_get_html('www.aktive-buergerschaft.de/buergerstiftungen/unsere_leistungen/buergerstiftungsfinder');

// split it via body, so you only get to the contents inside body tag
$split = split('<body>', $html);
// it is usually in the top of the array but just check to be sure
$body = $split[1];
// split again with, say,<p class="divider">A</p>
$split = split('<p class="divider">A</p>', $body);
// now this should contain just the data table you want to process
$data = $split[1];

// Find all links from original html
foreach($html->find('a') as $element) {
       $link = $element->href;

       // check if this link is in our data table
       if(substr_count($data, $link) > 0) {
           // link is in our data table, follow the link
           $html = file_get_html($link);
          // do what you have to do
       }
}


?>

关于我的方法的一些想法:

报废网页的标准做法是:

  1. 将页面读入字符串(file_get_html或现在正在使用的任何内容)
  2. 拆分字符串,这取决于页面结构。首先将它分开,因此数组的一个元素将包含正文,依此类推,直到我们得到目标。好吧,我猜最后的分裂将是
  3. A

    ,因为它有我们上面描述的链接:

    1. 如果我们希望关注该链接,只需重复相同的过程,但请使用链接。
    2. 或者,我们可以搜索一个获取页面中所有链接的PHP代码段。如果我们已经完成了1和2,那就更好了,我们现在只有标签内的字符串。这样简单得多。
    3. 嗯 - 我的问题是:这个错误会导致什么 - 我没有粘合剂......如果你有一个想法,那就太棒了

      更新:嗯 - 我可以试试这个:

      承认它没有比使用simple_html_dom更简单。

      $records = array();
      foreach($html->find('#content dl') as $contact) {
         $record = array();
         $record["name"] = $contact->find("dt", 0)->plaintext;
         foreach($contact->find("dd") as $field) {
             /* parse each $field->plaintext in order to obtain $fieldname */
             $record[$fieldname] = $field->plaintext;
         }
         $records[] = $record;
      }
      

      好吧 - 我试着在这里工作。也许我使用最新版本的PHP来获得类似jQuery的语法....嗯......

      任何想法

1 个答案:

答案 0 :(得分:1)

在您考虑抓取任何网站之前,我绝对想指出您需要考虑这样做的法律和道德影响。如果这不是您的网站或您未获得所有者的许可,您可能不应该抓。如果它不是供个人使用,你特别可能不应该刮。小心......

首先,在;之后需要一个分号($data = $split[1]),这将消除您的PHP语法错误。我对第一个错误感到有点困惑,指的是*,因为你的代码中没有任何*。

在您的语法错误消失后,虽然看起来您将在正确的轨道上编写MySQL查询并插入您的发现。

您也可以考虑以下内容:

foreach($html->find('a') as $element) 
   echo $element->href;

我希望有所帮助。