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

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

  • mp_petrol

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

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

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

  • md5

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

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

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

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

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

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

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

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

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

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

    Сообщения: ? Репутация: 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

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

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

    SimpleXML

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