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)
Ответ на: комментарий от fang90

cannot import name BeautifulSoup
нет данного модуля
Переделываю addon для kodi 14 (из коробки) т.е. ставить его не вариант.

pvvking ★★
() автор топика
Ответ на: комментарий от hippi90
pvvking@pvvking-kodi:~$ cat test.py
#!/usr/bin/env python
import xml.etree.ElementTree as ET
tree = ET.parse('document.xml')
root = tree.getroot()
root = ET.fromstring('country_data_as_string')
for child in root:
    print child.tag, child.attrib

pvvking@pvvking-kodi:~$ ./test.py
Traceback (most recent call last):
  File "./bs4.py", line 5, in <module>
    root = ET.fromstring('country_data_as_string')
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1301, in XML
    return parser.close()
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1654, in close
    self._raiseerror(v)
  File "/usr/lib/python2.7/xml/etree/ElementTree.py", line 1506, in _raiseerror
    raise err
xml.etree.ElementTree.ParseError: syntax error: line 1, column 0
pvvking@pvvking-kodi:~$
pvvking ★★
() автор топика
Ответ на: комментарий от pvvking

так у тебя в xml головы нет... нужен САМЫЙ ГЛАВНЫЙ ТЭГ, из которого растут остальные - это раз

какой кантри дата? это два.

ща покажу, как я видео с кхл им разбирал

odii
()
Ответ на: комментарий от pvvking
from xml.dom import minidom

xmldoc = minidom.parse('video.xml')

events = xmldoc.getElementsByTagName('event')
for ee in events:
    mid = int(ee.attributes['khl_id'].value)
    for s in ee.getElementsByTagName('goal'):
        title = s.attributes['title'].value
        tim = s.attributes['time'].value
        vlink = s.attributes['video'].value

http://text.khl.ru/text/xml/video_20150117.xml

odii
()

У тебя xml не валидный.

# -*- coding: utf-8 -*-
from xml.etree.ElementTree import fromstring, register_namespace

data = """
<root xmlns:vlc="http://vlc.com">
   <track>
      <location>udp://@239.255.2.122:1234</location>
      <title>Первый канал</title>
      <image>http://tv/87ee0234135d908dc1ac1b734abaa9a5/art.jpg</image>
      <extension application="http://www.videolan.org/vlc/playlist/0">
         <vlc:id>0</vlc:id>
      </extension>
   </track>
   <track>
      <location>udp://@239.255.2.123:1234</location>
      <title>Россия 1</title>
      <image>http://tv/2794d486041030d1898965579df778fe/art.jpg</image>
      <extension application="http://www.videolan.org/vlc/playlist/0">
         <vlc:id>1</vlc:id>
      </extension>
   </track>
</root>
"""

root = fromstring(data)
for el in root.iterfind('.//track'):
    location = el.find('location').text
    title = el.find('title').text.encode('utf-8')
    image = el.find('image').text
    vid = el.find('extension').find('{http://vlc.com}id').text
    print location, title, image, vid
bj
()
Ответ на: комментарий от bj
pvvking@pvvking-kodi:~$ cat bs4.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from xml.etree.ElementTree import parse

root = parse('playlist.xml')
for el in root.iterfind('.//track'):
    location = el.find('location').text
    title = el.find('title').text.encode('utf-8')
    image = el.find('image').text
    vid = el.find('extension').find('{http://vlc.com}id').text
    print location, title, image, vid

выдает пустоту
вот файл https://yadi.sk/d/P4Y_5qYOe4Tbm

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

Да, в стандартной библиотеке прям засада с неймспейсами.

# -*- coding: utf-8 -*-
from xml.etree.ElementTree import iterparse

it = iterparse('playlist.xml')
for _, el in it:
    el.tag = el.tag.split('}', 1)[1]  
root = it.root

for el in root.iterfind('.//track'):
    location = el.findtext('location')
    title = el.findtext('title').encode('utf-8')
    image = el.findtext('image')
    vid = el.find('extension').findtext('id')
    print location, title, image, vid
bj
()
Ответ на: комментарий от pvvking

К слову, вполне себе вариант, в стандартном репозитории Kodi аддон с данным модулем имеется и без проблем ставится по зависимости.

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

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


s=read("xmlfile")
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:item[^\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("|")

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

Я че-то не понял, ты что-то имеешь против xml-файлов, или new RegExp'ов? Или ты с мужиком-2 бухал вчера, и не похмелился? Выпей аспирину, говорят, помогает.

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

Мне честно, код «жалкого питониста» нравится больше. Он проще и понятнее. Сразу видно, что он делает и как он это делает. Вот тебе самому так не кажется? Какими принципами ты руководствовался, написав свой вариант?

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

самому так не кажется?

Нет, не кажется. Для того, чтобы сделать банальщину, я вынужден вникать в либу. Это типичный подход питонистов. Они всегда занимаются зубрежкой «микроязычков», вместо написания непосредственно кода. Голова типичного питониста всегда забита хламом.

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

И что же такое «простота» в твоём понимании?

Это ведь не риторический вопрос. Если ссылаешься на принцип о простоте, должен понимать какого вида простота в данном конкретно случае полезна (а какая вредна), зачем она нужна, как её достигнуть, и почему от неё (такой полезной) может быть выгоднее отклониться.

bogus_result
()

освой xpath[/xquery] будет проще, ликбез по xml на w3school будет легче...

Встречаются поточные утилиты, умеющие xpath в шелле, забыл название

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

ты выиграл. это даже не просто просто, это вообще элементарно. для пущей наглядности надо было это в одну строку запулить...

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

ReferenceError: read is not defined

Очень странно что ты дергаешь свистопердящий regex. Где конечный автомат? Ты же недавно просвещался.

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

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

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

Ладно, тогда твой код можно улучшить, сделав его понятнее. Это не будет противоречить ни одному из принципов, которым ты следуешь (ни kiss ни Бритве Оккама).

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

Это было рассчитиано не на питонистов, с их своеобразным мЫшлением, видимо. Где либа для read??? А-А-А!!!

read=function(file){
   return fs.readFileSync(file, "ascii")
}

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

Все равно не работает. Type Object has no method 'match'.

И больше того скажу. Твой код не учитывает одну важную деталь. Он тупо не рабочий (то есть на представленных данных выдает неправильный результат). Давай анонiмус, я верю в тебя, ты можешь все поправить, надо только еще строк 10 накропать.

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

Если у тебя входные данные XML, то они валидны.

Эх, Маруся... не все ещё XML/HTML, выдаваемые непонятно кем, ты видела....

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

Маруся у тебя в штанах, сынок. Когда исходные данные — XML, ошибка парсинга это «что-то страшное случилось», а не «и так сойдёт».

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

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

Можешь задать наводящие вопросы.

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

Аукционов? XML? Ты HTML с XML'ом не путаешь?

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

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

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

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

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

Нет, там реально не во всех записях есть все данные. А теперь мы все с нетерпением ждем вундерэкспа, который пофиксит проблему.

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

Какие данные, я хз, чо ты там чудишь. У тебя в норме должно быть до преобразования в строку 2 2 2 2, а после — 1 1 1 1

dkstra
()
Ответ на: комментарий от TGZ
...
</track>
</tracklist>
...
<vlc:node xmlns:vlc="vlc" title="Эфирный"></vlc:node>
...
</extension>
</playlist>
TGZ ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.