Найти - Пользователи
Полная версия: Парсер Яндекс XML
Начало » Python для новичков » Парсер Яндекс XML
1
Zverushko
Доброго времени суток!
Написал небольшой парсер 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'
Zverushko
кстати, есть ли внутри цикла for счетчик доступный из вне? по моему называется ForCounter или как то так?
FishHook
Zverushko
кстати, есть ли внутри цикла for счетчик доступный из вне? по моему называется ForCounter или как то так?
a = ['one', 'two', 'three', 'four', 'five']
for for_counter, x in enumerate(a):
    print x, for_counter
Zverushko
спасибо! дописал 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'   
FishHook
return ([x for x in enumerate(xml_urls,start=1) if url in x[1]][0])

1. наружные круглые скобки не нужны.
2. except без указания типа исключения - моветон. Лучше сделай проверку на пустой список.
Zverushko
Спасибо,учту
Не подскажете, в данный момент все 3 варианта работают по одному принципу поиска вхождения : if URL in element. Какие варианты проверки неточного вхождения так же возможны? Спасибо
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