LINUX.ORG.RU

[PHP or similar]html to xml


0

1

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

<ul>
    <li>Телепузик: <b>2 шт.</b></li>
    <li>Мишка Гамми</li>
    <li><i>Подраздел с боевиками:<i></li>
    <li>Чип и Дейл: <b>54</b></li>
</ul>
что-то такое:
<movie>
    <similarmov>
        <filmname>Телепузик</filmname>
        <wtf>шт</wtf>
        <value>2</value>
    </similarmov>
    <similarmov>
        <filmname>Мишка Гамми</filmname>
    </similarmov>
    <similarmov>
        <filmname>Чип и Дейл</filmname>
        <series>54</series>
    </similarmov>
</movie>
А вот сам вопрос: как было бы правильнее все это распарсить? Внутри движка на php через сниппеты, удаленно, разбирая контент питоном, или переделать весь контент, засунув все требуемые в xml поля в собственные контейнеры, которые очень просто потом движком вызвать и сформировать xml?

★★★★★

Разобрать на запчасти (в любой структурированный вид) через DOM/XPath, потом полученный набор данных уже сохранить как угодно.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

для выборки по DOM вроде требуется валидный xml с закрытыми тегами, чтобы ошибок не было? То есть - он пойдет дальше <hr />?

minakov ★★★★★
() автор топика
Ответ на: комментарий от minakov

для выборки по DOM вроде требуется валидный xml с закрытыми тегами

Никогда не проверял с этой точки зрения, но интенсивно использую DOM для парсинга внешних сайтов. Ошибок пока не замечал. То ли сайты обычно валидные, то ли DOM в PHP обрабатывает невалидные корректно.

То есть - он пойдет дальше <hr />?

А что в <hr/> невалидного? :) (таки да, в этом случае — идёт).

KRoN73 ★★★★★
()
Ответ на: комментарий от koriun

А для этой задачи есть XSLT

И он умеет преобразовывать по не строгим правилам для вариативных входящих структур невалидный XML? :)

KRoN73 ★★★★★
()
Ответ на: комментарий от koriun

tidy все равно ведь дает дополнительную нагрузку - мне же нужно очень минималистичное решение парсинга списка, удаляющее внутренние контейнеры <b> в одной строке, ну и вписывающее их в другую строку, разбивая на числовые значения и пару сиволов в другу строку..

minakov ★★★★★
() автор топика
Ответ на: комментарий от trashymichael

в пыхе просто такой дом, заточенный

При чём тут DOM, когда на счёт нестрогого формата — это уже XPath + код?

KRoN73 ★★★★★
()

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

SOmni ★★
()

Нужен именно XML на выходе?

Для скрейпинга постоянно юзаю simplehtmldom. Доволен. Удобно.

resurtm ★★★
()
Ответ на: комментарий от resurtm

simplehtmldom у меня не завелся - не везет на простые решения. Все что требовалось сделал, правда не без помощи более знающих людей [juick@stanis]. Я ломал, он пояснял как правильно. Ну и в соответствии с моими знаниями вышла такая заготовка для preg_replace:

$lipattern = array("#<li><i>(.*)<\/i><\/li>#", "#<li>#", "#</li>#", "[: |:]", "[ \((.*)\)|\((.*)\)]", "[</strong>|</em>]", "[ <strong>|<strong> |<strong>|<em>]", "#&(.*);#");
$lireplace = array("список_почти_полностью_состоящий_из_' ' ");
// Ну и для затравки:
$result = preg_replace($lipattern, $lireplace, $lisource);
Что является самым оптимизированным и быстрым вариантом :3

minakov ★★★★★
() автор топика
Ответ на: комментарий от Deleted

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

minakov ★★★★★
() автор топика
Ответ на: комментарий от minakov

Регекспы на больших кусках текста иногда начинают неожиданно тормозить и кушать память, особенно всяческие нелимитированные паттерны типа ".*". Именно поэтому я, хоть и люблю использовать регекспы, перед сравнением обязательно разбиваю исходный файл на не слишком большие куски (в приведенном примере - сделал бы explode по «<ul>»).

amomymous ★★★
()
Ответ на: комментарий от amomymous

В скрипте сначала preg_match() идет, который вытягивает все строки с <li></li>, однако учитывая что затем идет еще один preg_match(); для <p></p>... В общем тормозит, но к тому времени когда количество текста перевалит за пределы более-менее нормальной обработки, я его оптимизирую. Возможно даже через DOM парсить буду. Но не сейчас

minakov ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.