Форум сайта python.su
Доброго времени суток. Сразу прошу не пинать т.к. гугление не помогает.
Столкнулся с проблемой парсига одинаковых элементов.
Конкретно не пойму как получить данные из тега <type> находящегося в <attachment>. Помогите, расскажите как мне получить данные
Для парсинга использую xml.etree.ElementTree
<?xml version="1.0" encoding="utf-8"?> <response> <count>1259</count> <items list="true"> <post> <id>1597</id> <from_id>-433987</from_id> <to_id>-433987</to_id> <date>1397446</date> <post_type>post</post_type> <text>ыаыавваыв</text> <attachments list="true"> <attachment> <type>photo</type> <photo> <id>3264617</id> <album_id>-7</album_id> <owner_id>-433987</owner_id> <user_id>10</user_id> <photo_75>http://cs618927.vk.me/tq2VC_yp_xU.jpg</photo_75> <photo_130>http://cs618927.vk.me/pZULrBTO-nQ.jpg</photo_130> <photo_604>http://cs618927.vk.me/ZGcM1zyYIGY.jpg</photo_604> <width>500</width> <height>500</height> <text/> <date>13744348</date> <post_id>15197</post_id> <access_key>70699cee</access_key> </photo> </attachment> <attachment> <type>audio</type> <audio> <id>2758651</id> <owner_id>200104</owner_id> <artist>M</artist> <title>Tor</title> <duration>31</duration> <url>http://cs3-1v4.vk.me/p4/de3882e014c8.mp3</url> </audio> </attachment> <comments> <count>11</count> </comments> <likes> <count>36</count> </likes> <reposts> <count>6</count> </reposts> </post> </items> </response>
Отредактировано a1533382 (Апрель 15, 2014 14:32:17)
Офлайн
253
:D Чем больше работаю с xml тем больше его игнорирую.
>>> re.findall("<type>(.+)<",data) ['photo', 'audio']
Офлайн
857
>>> import xml.etree.ElementTree >>> >>> s = """<?xml version="1.0" encoding="utf-8"?> ... <response> ... <count>1259</count> ... <items list="true"> ... <post> ... <id>1597</id> ... <from_id>-433987</from_id> ... <to_id>-433987</to_id> ... <date>1397446</date> ... <post_type>post</post_type> ... <text>ыаыавваыв</text> ... <attachments list="true"> ... <attachment> ... <type>photo</type> ... <photo> ... <id>3264617</id> ... <album_id>-7</album_id> ... <owner_id>-433987</owner_id> ... <user_id>10</user_id> ... <photo_75>http://cs618927.vk.me/tq2VC_yp_xU.jpg</photo_75> ... <photo_130>http://cs618927.vk.me/pZULrBTO-nQ.jpg</photo_130> ... <photo_604>http://cs618927.vk.me/ZGcM1zyYIGY.jpg</photo_604> ... <width>500</width> ... <height>500</height> ... <text/> ... <date>13744348</date> ... <post_id>15197</post_id> ... <access_key>70699cee</access_key> ... </photo> ... </attachment> ... <attachment> ... <type>audio</type> ... <audio> ... <id>2758651</id> ... <owner_id>200104</owner_id> ... <artist>M</artist> ... <title>Tor</title> ... <duration>31</duration> ... <url>http://cs3-1v4.vk.me/p4/de3882e014c8.mp3</url> ... </audio> ... </attachment> ... </attachments> ... <comments> ... <count>11</count> ... </comments> ... <likes> ... <count>36</count> ... </likes> ... <reposts> ... <count>6</count> ... </reposts> ... </post> ... </items> ... </response> ... """ >>> >>> root = xml.etree.ElementTree.fromstring(s) >>> types = [i.text for i in root.findall('.//attachment/type')] >>> types ['photo', 'audio'] >>>
>>> import lxml.etree >>> >>> s = """<?xml version="1.0"?> ... <response> ... <count>1259</count> ... <items list="true"> ... <post> ... <id>1597</id> ... <from_id>-433987</from_id> ... <to_id>-433987</to_id> ... <date>1397446</date> ... <post_type>post</post_type> ... <text>ыаыавваыв</text> ... <attachments list="true"> ... <attachment> ... <type>photo</type> ... <photo> ... <id>3264617</id> ... <album_id>-7</album_id> ... <owner_id>-433987</owner_id> ... <user_id>10</user_id> ... <photo_75>http://cs618927.vk.me/tq2VC_yp_xU.jpg</photo_75> ... <photo_130>http://cs618927.vk.me/pZULrBTO-nQ.jpg</photo_130> ... <photo_604>http://cs618927.vk.me/ZGcM1zyYIGY.jpg</photo_604> ... <width>500</width> ... <height>500</height> ... <text/> ... <date>13744348</date> ... <post_id>15197</post_id> ... <access_key>70699cee</access_key> ... </photo> ... </attachment> ... <attachment> ... <type>audio</type> ... <audio> ... <id>2758651</id> ... <owner_id>200104</owner_id> ... <artist>M</artist> ... <title>Tor</title> ... <duration>31</duration> ... <url>http://cs3-1v4.vk.me/p4/de3882e014c8.mp3</url> ... </audio> ... </attachment> ... </attachments> ... <comments> ... <count>11</count> ... </comments> ... <likes> ... <count>36</count> ... </likes> ... <reposts> ... <count>6</count> ... </reposts> ... </post> ... </items> ... </response> ... """ >>> >>> root = lxml.etree.fromstring(s) >>> types = root.xpath('.//attachment/type/text()') >>> types ['photo', 'audio'] >>>
ValueError: Unicode strings with encoding declaration are not supported. Please use bytes input or XML fragments without declaration.
doza_andво, а теперь добавляем условие: тег <type> появляется где-нибудь в другом месте
Чем больше работаю с xml тем больше его игнорирую.>>> re.findall("<type>(.+)<",data) ['photo', 'audio']
Отредактировано py.user.next (Апрель 16, 2014 02:57:15)
Офлайн
20
py.user.nextА мне вариант doza_and понравился. Знаете, если копировать xml приведенный топик-стартером то при запуске ваших вариантов будет ругаться на незакрытый аттачмент, а топик-стартер не умеет пользоваться гуглом => он не найдет решение при возникновении подобной проблемы, а вариант с re выдаст ответ без корректировок. Так что каждый вариант имеет место быть
Офлайн
857
noob_saibotне, он сказал, что лучше использовать re, чем xml, а это не так
А мне вариант doza_and понравился.
noob_saibotтак я ему и написал, что закрыл этот тег, потому что по спецификации все теги xml должны быть закрыты
Знаете, если копировать xml приведенный топик-стартером то при запуске ваших вариантов будет ругаться на незакрытый аттачмент
noob_saibotне, речь о том, что вариант с re найдёт не то
а вариант с re выдаст ответ без корректировок
<?xml version="1.0" encoding="utf-8"?>
<response>
<count>1259</count>
<items list="true">
<post>
<id>1597</id>
<from_id>-433987</from_id>
<to_id>-433987</to_id>
<date>1397446</date>
<post_type>post</post_type>
<text>ыаыавваыв</text>
<attachments list="true">
<attachment>
<!-- привет, этот тип <type> означает, что атачмент - фотография, пока <:) -->
<type>photo</type>
<photo>
<id>3264617</id>
<album_id>-7</album_id>
<owner_id>-433987</owner_id>
<user_id>10</user_id>
<photo_75>http://cs618927.vk.me/tq2VC_yp_xU.jpg</photo_75>
<photo_130>http://cs618927.vk.me/pZULrBTO-nQ.jpg</photo_130>
<photo_604>http://cs618927.vk.me/ZGcM1zyYIGY.jpg</photo_604>
<width>500</width>
<height>500</height>
<text/>
<date>13744348</date>
<post_id>15197</post_id>
<access_key>70699cee</access_key>
</photo>
</attachment>
<attachment>
<type>audio</type>
<audio>
<id>2758651</id>
<owner_id>200104</owner_id>
<artist>M</artist>
<title>Tor</title>
<duration>31</duration>
<url>http://cs3-1v4.vk.me/p4/de3882e014c8.mp3</url>
</audio>
</attachment>
</attachments>
<comments>
<count>11</count>
</comments>
<likes>
<count>36</count>
</likes>
<reposts>
<count>6</count>
</reposts>
</post>
</items>
</response>
Отредактировано py.user.next (Апрель 17, 2014 06:28:51)
Офлайн
253
py.user.nextЭто где я так сказал?
не, он сказал, что лучше использовать re, чем xml, а это не так
Отредактировано doza_and (Апрель 17, 2014 21:47:07)
Офлайн