PHP-Dom-Processing: обзор кода маленькой Parser-программы - PullRequest
0 голосов
/ 04 июня 2011

большое спасибо за запуск этой доски. Я люблю этот сайт. Это помогло мне так часто! Вы молодцы. Сегодня я работаю над небольшим php-парсером!

Мне нужно получить все данные с этого сайта. См. Цель: www.aktive-buergerschaft.de/buergerstiftungen/unsere_leistungen/buergerstiftungsfinder. Я пытаюсь очистить данные с веб-страницы, но мне нужно получить все данные по этой ссылке. Я хочу сохранить данные в Mysql-db для лучшего поиска!

см. Пример:

Мне нужно получить все данные с этого сайта.

см. Цель: см. Эту ссылку здесь: Фонды в Германии - нажмите здесь

Я пытаюсь очистить данные с веб-страницы, но мне нужно получить все данные по этой ссылке.

см. Пример:

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. разбить строку, это зависит от структуры страницы. Сначала разделите его, чтобы один элемент массива содержал тело, и так далее, пока мы не получим нашу цель. Ну, я предполагаю, что окончательный сплит будет на
A

, поскольку он имеет ссылку, которую мы описали выше:

  1. Если мы хотим перейти по ссылке, просто повторите тот же процесс, но используя ссылку.
  2. В качестве альтернативы, мы можем искать фрагмент PHP, который получает все ссылки на странице. Это лучше, если мы уже сделали 1 и 2, и теперь у нас есть только строка внутри тега. Намного проще.

Ну, мой вопрос: что может вызвать эти ошибки - у меня нет клея ... было бы здорово, если у вас есть идея с нетерпением ждем

Обновление : Хм - я мог бы попробовать это:

Признавая, что это не становится проще, чем использование 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 Ответ

1 голос
/ 04 июня 2011

Я определенно хотел бы указать, прежде чем рассматривать возможность удаления какого-либо сайта, что вам необходимо учесть правовые и этические последствия этого. Если это не ваш сайт или если у вас нет разрешения от владельца, вы, вероятно, не должны пересматривать. Если это не для личного использования, вы, вероятно, не должны соскребать. Просто будь осторожен ...

Во-первых, вам нужна точка с запятой (;) после $data = $split[1], это избавит вас от ошибки синтаксиса PHP. Я немного смущен первой ошибкой, относящейся к *, потому что у вас нет нигде в вашем коде.

После того, как ваши синтаксические ошибки исчезнут, кажется, что вы на правильном пути, чтобы написать запрос MySQL и вставить свои выводы.

Вы также можете рассмотреть что-то вроде:

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...