Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 15, 2014 14:31:20

a1533382
Зарегистрирован: 2014-04-15
Сообщения: 1
Репутация: +  0  -
Профиль  

парсинг одинаковых XML элементов

Доброго времени суток. Сразу прошу не пинать т.к. гугление не помогает.

Столкнулся с проблемой парсига одинаковых элементов.
Конкретно не пойму как получить данные из тега <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)

Офлайн

#2 Апрель 15, 2014 20:33:14

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

парсинг одинаковых XML элементов

:D Чем больше работаю с xml тем больше его игнорирую.

>>> re.findall("<type>(.+)<",data)
['photo', 'audio']



Офлайн

#3 Апрель 16, 2014 02:26:03

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

парсинг одинаковых XML элементов

>>> 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']
>>>

поправил твой xml (добавил закрывающий тег)

ещё вариант через lxml
>>> 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.

модуль хоть и не стандартный (проблемы с установкой на винде), зато поудобнее, чем xml, и возможностей больше в плане xpath


doza_and
Чем больше работаю с xml тем больше его игнорирую.
>>> re.findall("<type>(.+)<",data)
['photo', 'audio']
во, а теперь добавляем условие: тег <type> появляется где-нибудь в другом месте

был тип атачмента, а добавили, к примеру, тип поста
и что ? правильно, код надо переписывать, а таких кодов сколько ? правильно, два миллиона



Отредактировано py.user.next (Апрель 16, 2014 02:57:15)

Офлайн

#4 Апрель 16, 2014 09:50:04

noob_saibot
Зарегистрирован: 2013-09-11
Сообщения: 495
Репутация: +  20  -
Профиль   Отправить e-mail  

парсинг одинаковых XML элементов

py.user.next
А мне вариант doza_and понравился. Знаете, если копировать xml приведенный топик-стартером то при запуске ваших вариантов будет ругаться на незакрытый аттачмент, а топик-стартер не умеет пользоваться гуглом => он не найдет решение при возникновении подобной проблемы, а вариант с re выдаст ответ без корректировок. Так что каждый вариант имеет место быть

Офлайн

#5 Апрель 17, 2014 06:27:16

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10016
Репутация: +  857  -
Профиль   Отправить e-mail  

парсинг одинаковых XML элементов

noob_saibot
А мне вариант doza_and понравился.
не, он сказал, что лучше использовать re, чем xml, а это не так
потому что re работает с текстом, а xml с документом (знает спецификацию)

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)

Офлайн

#6 Апрель 17, 2014 21:46:53

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

парсинг одинаковых XML элементов

py.user.next
не, он сказал, что лучше использовать re, чем xml, а это не так
Это где я так сказал?
А лучше или нет, зависит от ситуации. Понятие лучше в этом случае не имеет смысла.



Отредактировано doza_and (Апрель 17, 2014 21:47:07)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version