Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум Регулярные Выражения

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Помогите с xml дампом русской Википедии
 
 автор: mp_petrol   (23.02.2009 в 17:22)   письмо автору
 
 

<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>  
И так далее

Задача такова:
Нужно удалить всё от <page> до </page> (с тегами page в том числе), если <title> начинается с ключевых слов: Файл:, Изображение:, Mediawiki: и Википедия:
После этого надо скопировать значение из титла, преобразовать его в url код и вставить после <text xml:space="preserve">{{оригинал статьи|httр://ru.wikipedia.org/wiki/ ВОТ СЮДА }} Текст статьи с вики разметкой
чтобы имело вот такой вид:
<text xml:space="preserve">{{оригинал статьи|httр://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA }} Текст статьи с вики разметкой</text>

Помогите, ПОЖАЛУЙСТА! Программирование не знаю. А учить пхп ради одной задачи, нет времени.

  Ответить  
 
 автор: cheops   (23.02.2009 в 17:57)   письмо автору
 
   для: mp_petrol   (23.02.2009 в 17:22)
 

1) Ссылочку на дамп не дадите или приведите запись, в которой есть Файл:, Изображение:, Mediawiki: и Википедия: - они так и начинаются или используется вики-раметка вида [[Файл:1.gif|tumb|150px|Пример]]?
2) Image: учитывать?

PS Вы не счетчик правок часом ремонтируете?

  Ответить  
 
 автор: cheops   (23.02.2009 в 18:13)   письмо автору
 
   для: mp_petrol   (23.02.2009 в 17:22)
 

Информации мало, у вас там utf8 или как и где расположен "Текст статьи с викиразметкой"? В общем дамп бы нужен оригинальный или хотя бы кусочек в файле из двух статей (с файлом и обычной статьей), чтобы воспроизвести ситуацию можно было.
<?php 
  
// Открываем директорию 
  
$text '<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>   
И так далее
<page>   
<title>[[Файл:1.gifЗаголовок]]</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>   
И так далее'
;
  
$arr = array("Файл:""Изображение:""Mediawiki:""Википедия:");

  
// Удаляем лишние записи
  
foreach($arr as $word)
  {
    
$pattern "|<page>[\s]*<title>[^<]*".preg_quote($word)."[^<]+</title>(.+?)</page>|is"
    
$text =  preg_replace($pattern""$text);
  }

  
// Извлекаем названия
  
$pattern "|<title>(.*?)</title>|is";
  
preg_match_all($pattern$text$out);
  if(!empty(
$out[1]))
  {
    for(
$i 0$i count($out[1]); $i++)
    {
      
// $out[1][$i]
      
echo "<text xml:space=\"preserve\">".
                
"{{{$out[1][$i]}|httр://ru.wikipedia.org/wiki/".
                
rawurlencode($out[1][$i])."}} Текст статьи с вики разметкой</text>";
    }
  }
?> 

  Ответить  
 
 автор: mp_petrol   (23.02.2009 в 19:42)   письмо автору
 
   для: cheops   (23.02.2009 в 18:13)
 

В названии между <title></title> вики разметки нет, кодировка utf8. А вот между <text xml:space="preserve"></text> текст с вики разметкой. Дамп базы Википедии находится здесь http://download.wikimedia.org/ruwiki/20081228/ruwiki-20081228-pages-articles.xml.bz2 но размер зархивированого 500 мб. В разархивированном виде около 2Гб. Поэтому привожу кусок оригинального дампа.
А вот маленький файл (кусок дампа)

  Ответить  
 
 автор: mp_petrol   (23.02.2009 в 19:57)   письмо автору
 
   для: mp_petrol   (23.02.2009 в 19:42)
 

Почемуто не могу закачать файл на форум.
Может где нибудь в другом месте залить?

  Ответить  
 
 автор: cheops   (23.02.2009 в 19:59)   письмо автору
 
   для: mp_petrol   (23.02.2009 в 19:57)
 

Почему, файл загрузился - справа дискета.

  Ответить  
 
 автор: cheops   (23.02.2009 в 19:57)   письмо автору
7.7 Кб
 
   для: mp_petrol   (23.02.2009 в 19:42)
 

Прикреплю файл в виде архива, чтобы не расползалась тема.

  Ответить  
 
 автор: cheops   (23.02.2009 в 20:01)   письмо автору
 
   для: mp_petrol   (23.02.2009 в 19:42)
 

Хм... 2 Гб придется последовательно анализировать, наскоком столько просто в память, отведенную скрипту не влезет. Сейчас чего-нибудь придумаем...

  Ответить  
 
 автор: mp_petrol   (23.02.2009 в 20:20)   письмо автору
 
   для: cheops   (23.02.2009 в 20:01)
 

Теперь вижу, что загрузился.
Я файл могу разбить на куски и обрабатывать частями.

  Ответить  
 
 автор: cheops   (23.02.2009 в 21:04)   письмо автору
 
   для: mp_petrol   (23.02.2009 в 20:20)
 

Слушайте, а вы где обрабатывать будете, вам расширение mb_string() доступно? Следующее скрипт формально делает все правильно, однако, судя по всему бъет кодировку UTF-8 на операциях с регулярными выражениями в категориях, посвященных другим языковым разделам (или у меня редактор неправильно их отображает)
<?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($fd10000))
  {
    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"<text xml:space=\"preserve\">{{".$title.
                   
"|httр://ru.wikipedia.org/wiki/".rawurlencode($title).
                   
"}} $out[1]</text>\r\n");
            }
          }
        }
      }
    }
  }
  
// Закрываем файлы
  
fclose($fd);
  
fclose($fp);
?>

  Ответить  
 
 автор: mp_petrol   (23.02.2009 в 22:32)   письмо автору
 
   для: cheops   (23.02.2009 в 21:04)
 

Всё работает. И кодировка нормально отображается
Только я неточно объяснил что надо получить в результате.
Я когда писал что надо получить
<text xml:space="preserve">{{оригинал статьи|httр://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA }} Текст статьи с вики разметкой</text>
просто для краткости опустил все остальные теги
А надо чтобы получилось
<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">{{оригинал статьи|httр://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA }} Текст статьи с вики разметкой</text>  
</revision>  
</page>  

И я внес маленькое изменение
fwrite($fp, "<text xml:space=\"preserve\">{{".$title. 
                   "|httр://ru.wikipedia.org/wiki/".rawurlencode($title). 
                   "}} $out[1]</text>\r\n"); 

на
fwrite($fp, "<text xml:space=\"preserve\">{{Оригинальная статья|httр://ru.wikipedia.org/wiki/".rawurlencode($title). 
                   "}} $out[1]</text>\r\n"); 

Оригинальная статья - это не переменная, это название шаблона

  Ответить  
 
 автор: mp_petrol   (23.02.2009 в 23:06)   письмо автору
 
   для: mp_petrol   (23.02.2009 в 22:32)
 

И еще маленькое изменение и все то что мне нужно
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");

Осталось только проверить не бедет ли конфликтовать при импорте, если все <id> будут одинаковыми.

  Ответить  
 
 автор: mp_petrol   (24.02.2009 в 13:13)   письмо автору
 
   для: mp_petrol   (23.02.2009 в 23:06)
 

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

А после этого я обработал только те файлы, которые были опущены. И все, кроме двух(помечены двумя минусами) попали в файл result.txt

  Ответить  
 
 автор: cheops   (25.02.2009 в 02:27)   письмо автору
 
   для: mp_petrol   (24.02.2009 в 13:13)
 

Статьи, содержащие "Изображение:" вы сами просили исключить - если они нужны, необходимо удалить эту подстроку из массива
<?php
  $arr 
= array("Файл:""Изображение:""Mediawiki:""Википедия:");
?>

Чтобы воспроизвести и отладить ситуацию с другими статьями - нужен кусок дампа с окрестностью (пару статей ту и обратно) вокруг них.

  Ответить  
 
 автор: cheops   (25.02.2009 в 02:29)   письмо автору
 
   для: mp_petrol   (24.02.2009 в 13:13)
 

>А после этого я обработал только те файлы, которые были опущены. И все, кроме двух
>(помечены двумя минусами) попали в файл result.txt
А дамп с опущенными статьями большой? Чтобы отладить ситуацию - её следует воспроизвести.

  Ответить  
 
 автор: mp_petrol   (25.02.2009 в 11:53)   письмо автору
64 Кб
 
   для: cheops   (25.02.2009 в 02:29)
 

Статьи с ключевыми титлами удаляются - это всё правильно.
Я обработал тот файл, который закачал Вам на сайт, то-есть 1.4 Мб.
А вот я закачал файл содежащий только опущенные статьи (14 статей помеченных минусами). Интересно у Вас тоже кроме изображений исчезнут Нидерландский языковой союз и Пойковский 2008 (шахматный турнир).

Нет такого большого шрифта, для того что-бы выразить Вам ОГРОМНОЕ Спасибо!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования