Уведомления

Группа в Telegram: @pythonsu

#1 Июль 14, 2015 15:13:23

bender19911
Зарегистрирован: 2015-07-14
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распарсить xml!

Доброго времени суток!
Уважаемые форумчане, помогите пожалуйста, у меня есть xml файл вида:

<hostlist>
<host href="https://webmaster.yandex.ru/api/v2/hosts/*****" rel="self">
<name>domen.ua</name>
<verification state="VERIFIED"/>
<crawling state="INDEXED"/>
<virused>false</virused>
<last-access>2015-07-05T23:59:00</last-access>
<tcy>10</tcy>
<url-count>1135523</url-count>
<index-count>1234</index-count>
</host>
<host href="https://webmaster.yandex.ru/api/v2/hosts/*****" rel="self">
<name>domen.ru</name>
<verification state="VERIFIED"/>
<crawling state="INDEXED"/>
<virused>false</virused>
<last-access>2015-07-05T23:59:00</last-access>
<tcy>80</tcy>
<url-count>1503743</url-count>
<index-count>123456</index-count>
</host>
<host href="https://webmaster.yandex.ru/api/v2/hosts/*****" rel="self">
<name>avto.domen.ru</name>
<verification state="VERIFIED"/>
<crawling state="INDEXED"/>
<virused>false</virused>
<last-access>2015-07-05T11:28:00</last-access>
<tcy>0</tcy>
<url-count>9</url-count>
<index-count>1</index-count>
</host>
</hostlist>

Мне нужно сделать так, чтоб у меня при запросе в итоге выводилась информация о проиндексированных страницах только в domen.ru. В данном случае это 123456.
Помогите пожалуйста, как это сделать?

Офлайн

#2 Июль 14, 2015 19:46:55

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Помогите распарсить xml!

>>> from lxml import etree
>>> 
>>> s = """<hostlist>
... <host href="https://webmaster.yandex.ru/api/v2/hosts/*****" rel="self">
... <name>domen.ua</name>
... <verification state="VERIFIED"/>
... <crawling state="INDEXED"/>
... <virused>false</virused>
... <last-access>2015-07-05T23:59:00</last-access>
... <tcy>10</tcy>
... <url-count>1135523</url-count>
... <index-count>1234</index-count>
... </host>
... <host href="https://webmaster.yandex.ru/api/v2/hosts/*****" rel="self">
... <name>domen.ru</name>
... <verification state="VERIFIED"/>
... <crawling state="INDEXED"/>
... <virused>false</virused>
... <last-access>2015-07-05T23:59:00</last-access>
... <tcy>80</tcy>
... <url-count>1503743</url-count>
... <index-count>123456</index-count>
... </host>
... <host href="https://webmaster.yandex.ru/api/v2/hosts/*****" rel="self">
... <name>avto.domen.ru</name>
... <verification state="VERIFIED"/>
... <crawling state="INDEXED"/>
... <virused>false</virused>
... <last-access>2015-07-05T11:28:00</last-access>
... <tcy>0</tcy>
... <url-count>9</url-count>
... <index-count>1</index-count>
... </host>
... </hostlist>"""
>>> 
>>> e = etree.fromstring(s)
>>> print e.xpath('.//name[text()="domen.ru"]/ancestor::host/index-count/text()')
['123456']



————————————————
-*- Simple is better than complex -*-

Офлайн

#3 Июль 15, 2015 00:05:11

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

Помогите распарсить xml!

doc.xpath(r'.//name[text() = "domen.ru"]/../index-count/text()')



Офлайн

#4 Июль 16, 2015 20:40:53

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Помогите распарсить xml!

py.user.next

<hostlist>
<host href="https://webmaster.yandex.ru/api/v2/hosts/*****" rel="self">
<name>domen.ru</name>
<index-count>123456</index-count>
</host>
<site href="https://webmaster.yandex.ru/api/v2/hosts/*****">
<name>domen.ru</name>
<index-count>
	<host name="yandex"> 1 </host>
	<host name="google"> 2 </host>
</index-count>
</site>
</hostlist>
поэтому лучше всегда указывать родителя



————————————————
-*- Simple is better than complex -*-

Отредактировано terabayt (Июль 16, 2015 20:44:42)

Офлайн

#5 Июль 16, 2015 23:45:09

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

Помогите распарсить xml!

terabayt
поэтому лучше всегда указывать родителя
У него там всегда есть host. Список узлов (hostlist), состоящий из узлов (host), включающих информацию об узле.



Офлайн

#6 Июль 17, 2015 02:25:21

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Помогите распарсить xml!

py.user.next
У него там всегда есть host. Список узлов (hostlist), состоящий из узлов (host), включающих информацию об узле.
да, но
1) не факт что у него действительно так, а это прост пример
2) факт, что что-то измениться
3) может и не совсем, но все же
Explicit is better than implicit.



————————————————
-*- Simple is better than complex -*-

Офлайн

#7 Июль 17, 2015 03:40:45

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

Помогите распарсить xml!

terabayt
1) не факт что у него действительно так, а это прост пример
Ну, судя по его xml, он грамотно сформирован. В таком не возникнет каша-малаша.

terabayt
2) факт, что что-то измениться
Не, нельзя покрывать все варианты раньше времени. Это преждевременная оптимизация.

Как в hostlist может появиться site, если это не хост? А если это host, почему он называется site, а не host?



Офлайн

#8 Июль 17, 2015 03:50:07

terabayt
От: Киев
Зарегистрирован: 2011-11-26
Сообщения: 1099
Репутация: +  103  -
Профиль   Отправить e-mail  

Помогите распарсить xml!

py.user.next
Не, нельзя покрывать все варианты раньше времени.
я и не говорю об этом
я говорю о том, что нужно явно указывать!

py.user.next
Как в hostlist может появиться site, если это не хост? А если это host, почему он называется site, а не host?

ну эт прост пример



————————————————
-*- Simple is better than complex -*-

Офлайн

#9 Июль 17, 2015 07:00:24

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

Помогите распарсить xml!

terabayt
я и не говорю об этом
я говорю о том, что нужно явно указывать!
Так зачем явно указывать, если это и так явно? У тебя она как бы предусматривает наличие каши среди нормального кода. Даже если каша есть какая-то, она должна быть почищена до передачи в функцию разбора. Нельзя писать код, который делает всё сразу. Чисткой должна заниматься одна функция, вытаскиванием нужного поля - другая. В этом заключается их функциональная прочность.



Офлайн

#10 Июль 17, 2015 09:20:07

bender19911
Зарегистрирован: 2015-07-14
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Помогите распарсить xml!

Всем спасибо!

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version