ФорумПрограммированиеPHP для идиотов → Обработка xml дампа Википедии

Обработка xml дампа Википедии

  • mp_petrol

    Сообщения: 2 Репутация: N Группа: Кто попало

    Spritz 24 февраля 2009 г. 9:56

    Помогите найти ошибку в скрипте
    Скрипт производит обработку xml документа, таким образом, что удаляет статьи которые начинаются с ненужных ключевых слов (Файл:, Изображение:, Mediawiki: и Википедия: ), а потом добавляет в статью ссылки на оригинальную статью в Википедии. Проблема в том что удаляются и некоторые статьи  не содержащие в титле ключевых слов
    Вот скрипт
    <?php  
     // Устанавливаем не ограниченное время выполнения скрипта
     set_time_limit(0);
     // Открываем дамп
     $fd = fopen("dump.txt", "rb");
     if(!$fd) exit("Файл отсутствует");
     // Открываем файл для разультата
     $fp = fopen("result.txt", "a");
     if(!$fp) exit("Не возможности создать файл назначения");
     // Флаги состоянния
     $found_page = false;
     $found_title = false;
     $found_article = false;
     $title = "";
     $article = "";
     $arr = array("Файл:", "Изображение:", "Mediawiki:", "Википедия:");
     // Построчно анализируем файл
     while($line = fgets($fd, 10000))
     {
       if(!$found_page)
       {
         // Начало новой статьи пока не найдено
         if(stripos($line, "<page>") !== false)
         {
           $found_page = true;
           $title = "";
           $article = "";
         }
       }
       else
       {
         // Начало статьи найдено
         if(!$found_title)
         {
           if(stripos($line, "<title>") !== false)
           {
             // Найден заголовок
             $found_title = true;
             // Извлекаем названия
             $pattern = "|<title>(.*?)</title>|is";
             if(preg_match($pattern, $line, $out))
             {
               $title = $out[1];
               // Игнорируем "Файл:", "Изображение:", "Mediawiki:", "Википедия:"
               foreach($arr as $word)
               {
                 if(stripos($line, $word) !== false)
                 {
                   $found_page = false;
                   $found_title = false;
                 }
               }
             }
           }
         }
         else
         {
           if(!$found_article)
           {
             if(stripos($line, "<text") !== false)
             {
               $found_article = true;
               $article .= $line;
             }
           }
           else
           {
             $article .= $line;
             if(stripos($line, "</text>") !== false)
             {
               $found_page = false;
               $found_title = false;
               $found_article = false;
               // Оставляем запись в файле назначения
               $pattern = "|<text[^>]+>(.*?)</text>|is";
               if(preg_match($pattern, $article, $out))
               {
                 fwrite($fp, "<page>    
    <title>".$title."</title>    
    <id>380248</id>    
    <revision>    
    <id>2097005</id>    
    <timestamp>2008-12-16T14:07:23Z</timestamp>    
    <contributor>    
    <username>mp_petrol</username>    
    <id>9835</id>    
    </contributor>    
    <minor />    
    <comment>Комментарий</comment>
    <text xml:space=\"preserve\">{{Оригинал статьи|httр://ru.wikipedia.org/wiki/".rawurlencode($title).  
                      "}} $out[1]</text></revision>    
    </page>\r\n");             }
             }
           }
         }
       }
     }
     // Закрываем файлы
     fclose($fd);
     fclose($fp);
    ?>

    А вот такая структура xml дампа
    <page>   
    <title>Заголовок</title>  
    <id>380248</id>  
    <revision>  
    <id>2097005</id>  
    <timestamp>2008-12-16T14:07:23Z</timestamp>  
    <contributor>  
    <username>User</username>  
    <id>9835</id>  
    </contributor>  
    <minor />  
    <comment>Комментарий</comment>  
    <text xml:space="preserve">Текст статьи с вики разметкой</text>  
    </revision>  
    </page>  
    И так далее

  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 24 февраля 2009 г. 9:57, спустя 1 минуту 16 секунд

    http://pyha.ru/articles/php/dom/
    все умрут, а я изумруд
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 24 февраля 2009 г. 10:07, спустя 9 минут 8 секунд

    удаляет статьи которые начинаются с ненужных ключевых слов

    Как именно удаляет? Может исключает (игнорирует)? Это не одно и тоже. Надо формулировать точнее…

    Помогите найти ошибку в скрипте

    Как выглядят титлы у статей которые попали под ваши правила и которые были исключены?
    Нужны реальные примеры.

    Что именно вы парсите? Википедию?
    adw/0
  • mp_petrol

    Сообщения: 2 Репутация: N Группа: Кто попало

    Spritz 24 февраля 2009 г. 10:35, спустя 28 минут 23 секунды

    Парсим Википедию.
    Не включает в новый файл. Какая закономерность понять не могу. Например обрабатывал кусок дампа со следующими титлами (минусами помечены те которые не попали в обработанный файл).
    - -Изображение:Websphere logo.png
    F.
    - - Изображение:Азиан Вэнс.jpg
    Влад IV Монах
    Static (альбом)
    Static
    EMI (значения)
    Даре, Жак
    Жак Даре
    - Медаль «За службу в подводных силах»
    Амбидекстр
    - Сеченово (Нижегородская область)
    EMI (физический термин)
    Вернер фон Фрич
    - Даре
    Сеченовский район
    - - Изображение:Абдуллаев, Ровнаг Ибрагим оглы.jpg
    Контрреволюция
    Категория:Бад-Мускау
    - Медаль «За службу в Космических войсках»
    Alessandro Sommella
    - Стадион Десятилетия
    Кун, Якоб
    Федор Емельяненко
    - Исаакиевский мост
    Силья Лайн
    - - Нидерландский языковой союз
    Корнилов, Дмитрий Владимирович
    Маркерное кольцо
    - Шанигартен
    Харар
    Соммелла, Алессандро
    IEEE 802.5
    - Александровский уезд
    Сабры (цабарим)
    - Sommella, Alessandro
    Меньцзянь
    - - Пойковский 2008 (шахматный турнир)
    Гран-При Баку 2008 (Шахматный турнир)

    Чтобы проверить или в названиях опущенных статей есть что-то что влияет на обработу. Я попробовал обработать те статьи которые были упущены.
    И все кроме двух (помечены двумя минусами) попали в файл result.txt (Статьи которые начинаются с ключевых слов Изображение должны опускаться)
  • disc

    Сообщения: 843 Репутация: N Группа: Джедаи

    Spritz 24 февраля 2009 г. 10:43, спустя 7 минут 40 секунд

    SimpleXML

Пожалуйста, авторизуйтесь, чтобы написать комментарий!