Форум сайта python.su
0
Доброго времени суток!
Написал небольшой парсер XML.Yandex. Код ниже.
В конце кода есть 2 модуля, parse и parse 2, которые разбирают массив урлов из xml выдачи и возвращают позицию и урл для сайта. Оба работают.
Как вы думаете, какой из них лучше работает? и какие еще могут быть варианты парсера с целью получения урла и позиции
python 3.3
Заранее спасибо!
#--*-- coding: utf-8 --*-- import urllib.request from xml.dom.minidom import parseString class ya_search: def __init__(self,query,region='213',page='100'): self.query=query self.region=region self.page=page ya_user='kashkovsky' ya_key='03.46585082:f5a6271f3c5d9bad3ab17adcd1ff3f06' def yandex_key(self): return ('http://xmlsearch.yandex.ru/xmlsearch?user='+self.ya_user+'&key='+self.ya_key+'&lr=') def xml_build(self): defaults_xml='''<?xml version="1.0" encoding="UTF-8"?> <request> <query>%s</query> <groupings> <groupby attr="d" mode="deep" groups-on-page="%s" docs-in-group="1" /> </groupings> </request>''' return (defaults_xml % (self.query,self.page)).encode() def response(self): ya_url=self.yandex_key()+self.region return (urllib.request.urlopen(ya_url,self.xml_build())).read().decode() def urls(self): urls_xml=[] dom_xml=parseString(self.response()).getElementsByTagName('url') for node in dom_xml: urls_xml.append(node.childNodes[0].nodeValue.lower()) return urls_xml def parse(self,url): i=0 xml_urls=self.urls() while i<len(xml_urls): if url in xml_urls[i]: break i += 1 if i+1<len(xml_urls): return i+1,xml_urls[i] else: return 'Нет в топ 100' def parse2(self,url): xml_urls=self.urls() results=[x for x in xml_urls if url in x ] try: return (xml_urls.index(results[0])+1,results[0]) except: return 'Нет в топ 100'
Офлайн
0
кстати, есть ли внутри цикла for счетчик доступный из вне? по моему называется ForCounter или как то так?
Офлайн
568
Zverushko
кстати, есть ли внутри цикла for счетчик доступный из вне? по моему называется ForCounter или как то так?
a = ['one', 'two', 'three', 'four', 'five'] for for_counter, x in enumerate(a): print x, for_counter
Офлайн
0
спасибо! дописал 3ий вариант:
def parse3(self,url): xml_urls=self.urls() try: return ([x for x in enumerate(xml_urls,start=1) if url in x[1]][0]) except: return 'Нет в топ 100'
Офлайн
568
return ([x for x in enumerate(xml_urls,start=1) if url in x[1]][0])
Офлайн
0
Спасибо,учту
Не подскажете, в данный момент все 3 варианта работают по одному принципу поиска вхождения : if URL in element. Какие варианты проверки неточного вхождения так же возможны? Спасибо
Офлайн