Уведомления

Группа в Telegram: @pythonsu

#1 Апрель 22, 2013 19:43:15

Zverushko
Зарегистрирован: 2013-04-22
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсер Яндекс XML

Доброго времени суток!
Написал небольшой парсер 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'

Офлайн

#2 Апрель 22, 2013 19:48:03

Zverushko
Зарегистрирован: 2013-04-22
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсер Яндекс XML

кстати, есть ли внутри цикла for счетчик доступный из вне? по моему называется ForCounter или как то так?

Офлайн

#3 Апрель 23, 2013 08:12:13

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсер Яндекс XML

Zverushko
кстати, есть ли внутри цикла for счетчик доступный из вне? по моему называется ForCounter или как то так?
a = ['one', 'two', 'three', 'four', 'five']
for for_counter, x in enumerate(a):
    print x, for_counter



Офлайн

#4 Апрель 23, 2013 10:54:53

Zverushko
Зарегистрирован: 2013-04-22
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсер Яндекс XML

спасибо! дописал 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'   

Офлайн

#5 Апрель 23, 2013 12:06:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Парсер Яндекс XML

return ([x for x in enumerate(xml_urls,start=1) if url in x[1]][0])

1. наружные круглые скобки не нужны.
2. except без указания типа исключения - моветон. Лучше сделай проверку на пустой список.



Офлайн

#6 Апрель 23, 2013 23:25:00

Zverushko
Зарегистрирован: 2013-04-22
Сообщения: 17
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсер Яндекс XML

Спасибо,учту
Не подскажете, в данный момент все 3 варианта работают по одному принципу поиска вхождения : if URL in element. Какие варианты проверки неточного вхождения так же возможны? Спасибо

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version