LINUX.ORG.RU

Как разобрать xml на python

 ,


3

4

Помогите. На питоне разобрать xml. Сам на питоне не писал.

pvvking@pvvking-kodi:~$ cat document.xml
<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
    <title>TV</title>
    <date>2013-12-23T15:18:51+06:00</date>
    <trackList>
    <track>
        <location>udp://@239.255.2.122:1234</location>
        <title>Первый канал</title>
        <image>http://gl.weburg.net/00/tv/channels/1/14/amino/380642.jpg</image>
        <creator>Weburg.TV</creator>
        <extension application="http://www.videolan.org/vlc/playlist/0">
            <vlc:id xmlns:vlc="vlc">1</vlc:id>
        </extension>
    </track>
    <track>
        <location>udp://@239.255.2.123:1234</location>
        <title>Россия 1</title>
        <image>http://gl.weburg.net/00/tv/channels/1/16/amino/380637.jpg</image>
        <creator>Weburg.TV</creator>
        <extension application="http://www.videolan.org/vlc/playlist/0">
            <vlc:id xmlns:vlc="vlc">2</vlc:id>
        </extension>
    </trackList>
  <extension application="http://www.videolan.org/vlc/playlist/0">
  <vlc:node xmlns:vlc="vlc" title="Эфирный">
  <vlc:item tid="1"></vlc:item>
  <vlc:item tid="2"></vlc:item>
  </playlist>
что хочется получить
location|title|image|vlc:id
udp://@239.255.2.122:1234|Первый канал|http://tv/87ee0234135d908dc1ac1b734abaa9a5/art.jpg|0
udp://@239.255.2.123:1234|Россия 1|http://tv/2794d486041030d1898965579df778fe/art.jpg|1

★★

Последнее исправление: pvvking (всего исправлений: 3)
Ответ на: комментарий от bj

Ты их парсил поколоночно

Нет. Я вообще не пойму о чем ты лепечешь. У тебя вывод соответствует заявленому ТС или нет? console.log(data) что выводит? Если это то что надо (как в моем случае) — разговаривать не о чем.

dkstra
()
Ответ на: комментарий от bj

Короче, у меня все работает. Мне кому верить, своим глазам или тебе? Выбор очевиден. Твои мнимые претензии к коду я списываю на попаболь.

dkstra
()
Ответ на: комментарий от bj

Внимание, внимание! Новость дня! Дкстра смог написать код для парсинга XML с регэкспами и функцией map, чем привел в полное недоумение троллей, анонимуса, и других обитателей ЛОРа. Впрочем, по причине чрезвычайной криптанутости его кода, он так и не сумел ничего доказать!На данный момент противостояние продолжается! 😊

bogus_result
()

Как это я удачно попкорна купил

Ubuntu1210
()
Ответ на: комментарий от dkstra

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

Данные:

<?xml version="1.0" encoding="UTF-8"?>
<playlist xmlns="http://xspf.org/ns/0/" xmlns:vlc="http://www.videolan.org/vlc/playlist/ns/0/" version="1">
  <title>Weburg.TV</title>
  <creator>Weburg Ltd.</creator>
  <date>2015-01-18T12:26:01+05:00</date>
  <trackList>
    <track>
      <location>udp://@239.255.2.122:1234</location>
      <title>Первый канал</title>
      <extension application="http://www.videolan.org/vlc/playlist/0">
        <vlc:id xmlns:vlc="vlc">1</vlc:id>
      </extension>
    </track>
    <track>
      <location>udp://@239.255.2.123:1234</location>
      <title>Россия 1</title>
      <image>IMAGE FOR RUSSIA CHANNEL</image>
      <extension application="http://www.videolan.org/vlc/playlist/0">
        <vlc:id xmlns:vlc="vlc">2</vlc:id>
      </extension>
    </track>
  </trackList>
</playlist>

Твой говнокод, поправленный, чтоб он хоть как-то хромал:

fs = require('fs')
s = fs.readFileSync('/tmp/playlist.xml', 'utf-8')

parse=function(word){
   var re=new RegExp("<"+word+">[^<]+", "g")
   return s.match(re).map(function(e){return e.replace(/^.*>/, "")})
}
data=[
 parse("location"),
 parse("title").slice(1),
 parse("image"),
 s.match(/<vlc:id[^\d]+(\d+)/g).map(function(e){return e.replace(/\D+/g, "")})
]

data=data.map(function(arr){return arr[0]})
 .join("|")+"\n"+data.map(function(arr){return arr[1]}).join("|")

console.log(data)

И выхлоп:

udp://@239.255.2.122:1234|Первый канал|IMAGE FOR RUSSIA CHANNEL|1
udp://@239.255.2.123:1234|Россия 1||2

И если ты, животное, хотя тут даже макака может заметить проблему, даже сейчас не поймешь, то обозначу багу совсем явно: картинка для «Россия 1» уползла на «Первый канал».

Давай, кукарекай теперь.

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

XML парсят регэкспами только извращенцы.
Если у тебя входные данные XML, то они валидны. Если у тебя «HTML» из ада то используются супопарсеры.

Если бы все вещи были столь однозначны - жить в нашем суровом мире было бы значительно проще. У регэкспов в некоторых случаях бывает по крайней мере одно преимущество - они оказываются быстрее. Но всё зависит от типа задачи и места её применения, да.

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

Бесспорно. Регекспы иногда даже лучше, поскольку позволяют игнорировать ошибки в структуре xml, когда эти ошибки не важны.

Выцепить несколько тэгов с данными как раз такой случай. Но делать это надо с умом. Вот например в данном случае: не важно правильный или неправильный xml попался. Важно, чтобы каждый выцепляемый набор тэгов был min полным - нужно убедиться, что все интересующие нас тэги присутствуют в выцепленном наборе. Остальные ошибки в структуре xml как раз лучше игнорировать.

И понятность опять же. Это конечно тоже не абсолютное добро, но чаще всего оправдывает себя. Как-то интерфейс специализированных библиотек для разбора xml способствует написанию понятного кода. Код Дкстра ведь плох не использованием регэкспов, а тем что он непонятен, неструктурирован, трудномодифицируем, не учитывает граничные и ошибочные ситуации.

bogus_result
()
Ответ на: комментарий от Ubuntu1210

В теории новомодными регэкспами это возможно😊 Но это реально *уита в квадрате.

bogus_result
()
Ответ на: комментарий от bj

Теперь я убедился окончательно в том, что ты конченый идиот. вот тебе XML

<huy>huy</huy>
Твой парсер правильно его обрабатывает? Ниче не уползло?

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

Ты кукарекаешь неправильно. У ТСа это реальные данные.

У тебя, по сути, немного вариантов.

* Признать себя конченой нулиной.

* Попробовать написать рабочий код.

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

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

bj
()
Последнее исправление: bj (всего исправлений: 1)
Ответ на: комментарий от bj

У ТСа это реальные данные.

да что ты говоришь, петушок, найди десять отличий:

<title>Первый канал</title>     <image>http://gl.weburg.net/00/tv/channels/1/14/amino/380642.jpg</image>
<title>Первый канал</title>
      <extension application="http://www.videolan.org/vlc/playlist/0">

dkstra
()
Ответ на: комментарий от Ubuntu1210

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

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

В твоём сообщении упоминался не только xml:

Если у тебя «HTML» из ада то используются супопарсеры.

А в моём про скорость указывалось не случайно:

У регэкспов в некоторых случаях бывает по крайней мере одно преимущество - они оказываются быстрее.

И не просто так говорилось:

Но всё зависит от типа задачи и места её применения, да.

Так вот, немного о задаче - как и у ОПа это дополнение к Kodi/XBMC, правда в моём случае парсится не xml, а html, и помимо этого в требованиях присутствует такой пункт как «адекватная работа» на Raspberry Pi. На данный момент всё реализовано именно с помощью beautifulsoup, нет, оно конечно работает, но об «адекватной работе» говорить не приходится - всё ужасно медленно.

anonymous
()
Ответ на: комментарий от fang90

Не знаю как etree, а вот знакомый сказал что libxml2 очень плохо работало на больших файлах. Регекспом (perl) было быстрее на несколько порядков.

Но я за использование etree потому что кривые самопальные регексп-парсеры это частая причина неработоспособности сайтов. Причём, зачастую там такая каша что хрен разберёшь. Что касается объёма кода то, грубо говоря, это никого не волнует. Вообще. От того что кода стало на две строчки меньше в одном простом компоненте бизнес не выиграет.

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

согласен, но я все же стараюсь использовать bs как универсальное решение (xml/html). С ним код понятнее и не перегружен всякими специфичными для парсинга xml вещами. По скорости ничего не могу сказать т.к. у меня большая часть времени тратится на получение xml/html из облака, вот потому и интересуюсь:)

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

Смотри, leave, как этот хуесос разошелся. Петушками всех называет, а у самого жопа полна сметаны

anonymous
()
Ответ на: комментарий от fang90

Я правильно понимаю что bs ещё умеет «проглатывать» некоторые ошибки в xml? (пишу по памяти, последний раз смотрел на него лет эдак пять-семь назад). Всё же кривой xml это ой как не редкость если его генерят вручную из похапэ. Тут и с кодировками проблемы, и тэги могут быть незакрытые итд итп... В таких случаях etree не помощник.

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

Я правильно понимаю что bs ещё умеет «проглатывать» некоторые ошибки в xml?

Ага. И в юникод все конвертит, что тоже полезно

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

!!!Не коммерция!!!Хобби
Для себя и Жены (с большой буквы ЛЮБЛЮ ЕЁ) понравился ей XBMC теперь Kodi) и славного города Екатеринбург.
Есть пока только мысли (и почти готовый addon был до этого скрипт на perl, код готов для http://weburg.net/), это выложить в addon для Kodi(XBMC). И вот вопросы...
Как Вы относитесь с данным кодом и его (доработкой мной и не только )
Ну так как к Вам много вопросов, вопросы в доработке.
::почта мойникGAV(не помню как собачка лает у меня кошка та которая на аватарке)mail.ru

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