Найти - Пользователи
Полная версия: Помогите распарсить xml!
Начало » Python для новичков » Помогите распарсить xml!
1
bender19911
Доброго времени суток!
Уважаемые форумчане, помогите пожалуйста, у меня есть 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.
Помогите пожалуйста, как это сделать?
terabayt
>>> 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']
py.user.next
doc.xpath(r'.//name[text() = "domen.ru"]/../index-count/text()')
terabayt
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>
поэтому лучше всегда указывать родителя
py.user.next
terabayt
поэтому лучше всегда указывать родителя
У него там всегда есть host. Список узлов (hostlist), состоящий из узлов (host), включающих информацию об узле.
terabayt
py.user.next
У него там всегда есть host. Список узлов (hostlist), состоящий из узлов (host), включающих информацию об узле.
да, но
1) не факт что у него действительно так, а это прост пример
2) факт, что что-то измениться
3) может и не совсем, но все же
Explicit is better than implicit.
py.user.next
terabayt
1) не факт что у него действительно так, а это прост пример
Ну, судя по его xml, он грамотно сформирован. В таком не возникнет каша-малаша.

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

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

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

ну эт прост пример
py.user.next
terabayt
я и не говорю об этом
я говорю о том, что нужно явно указывать!
Так зачем явно указывать, если это и так явно? У тебя она как бы предусматривает наличие каши среди нормального кода. Даже если каша есть какая-то, она должна быть почищена до передачи в функцию разбора. Нельзя писать код, который делает всё сразу. Чисткой должна заниматься одна функция, вытаскиванием нужного поля - другая. В этом заключается их функциональная прочность.
bender19911
Всем спасибо!
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB