LINUX.ORG.RU

[python][XML] Направьте в верном направлении

 ,


0

1

Суть такова:

Я получаю по ссылке XML, и его надо распарсить, рассовав по массивам то, что хранится в тэгах. Перегуглил все, что только можно, ничерта не выходит.

Собственно, вот так вот я получаю саму страницу:

url = "https://api.vkontakte.ru/method/audio.get.xml?uid=403273&access_token=bf3a7de2f16a2552bf636d0684bf1db4ef3bf3cbf3c5aa345a8d964cc68c273"
page = urllib2.urlopen(url)
html = page.read()

(Да да, вконтакте не нужен, вы все такие правильные, об этом мне говорите, ага) Собственно, если потом сделать print html, то выводится XML в нормальном виде, т.е.

<response list="true">
<audio>
<aid>115640729</aid>
<owner_id>403273</owner_id>
<artist>Lordi</artist>
<title>Monster monster</title>
<duration>203</duration>
<url>http://cs4693.vkontakte.ru/u84488867/audio/7228a16e0c2a.mp3</url>
</audio>
<audio>
<aid>115640436</aid>
<owner_id>403273</owner_id>
<artist>Lordi</artist>
<title>This is Heavy Metal</title>
<duration>181</duration>
<url>http://cs4713.vkontakte.ru/u5339245/audio/d12656a247ce.mp3</url>
</audio>

Теперь надо выдернуть из нее инфу по тэгам artist, title, url и засунуть в соответствующие массивы это все, откуда потом будет дергаться дальше.

Вопрос - как?

Гуглю уже часа 2, нифига не выходит. Вот примерный мой код, писал по примеру с официальной документации питона.

for node in f.getElementsByTagName("audio"):
	L = node.getElementsByTagName("title")
	for node2 in L:
		aid = ""
		for node3 in node2.childNodes:
			if node3.nodeType == Node.TEXT_MODE:
				aid += node3.data
			print aid 

Что-то мне подсказывает, что в коде у меня туфта...

Специалисты по питону, подскажите! Уже весь мозг поломал...

★★★★★

Что-то мне подсказывает, что в коде у меня туфта...

По шагам выполнять пробовал? Что мне подсказывает, что нет. Попробуй.

Специалисты по питону, подскажите! Уже весь мозг поломал...

Скажи мне, как по-твоему люди специалистами становятся?

Begemoth ★★★★★
()
import lxml.html
html  = lxml.html.fromstring(html)
audio = html.cssselect("audio")
for i in audio:
    aid, url, artist = i.cssselect("aid, url, artist")
rival ★★
()
Ответ на: комментарий от anonymous

Извиняюсь, не распарсил, разверите cвою `мысль' пошире, может пойдет.

n01r ★★
()

from xml.etree import ElementTree

response = ElementTree.fromstring(string)
for audio in response:
    artist = audio.find('artist').text
    # etc
ntp
()

Юзай пулл-парсеры, Люк!

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

пойду насиловать питон и мозг.

До кучи посношай xpath.

baverman ★★★
()

Почему бы просто не использовать JSON (модуль simplejson для скорости, json вместо xml в адресе)? Ответ от сервера можно будет перевести в python dict одной строчкой — json.loads().

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

Да, собственно, я уже сделал с помощью lxml, реально две строчки кода и все работает. Я просто тупил поначалу, видел мануалы по ней, но думал, что «Вот еще, дополнительную хрень ставить!». Идиот =)

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

Ну вот как-то так, да =) Но я вовремя остепенился.

Zhbert ★★★★★
() автор топика

Такое обычно решают через sax. Будет и быстрее и читабельнее если парсишь сложных xml.

anonymous
()
         o Python



                        o XML
             /
            /
           /
          /
         /
        /
      |_
           Верное направление


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