Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 28, 2017 13:15:50

zacejuja
Зарегистрирован: 2017-06-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите подправить

здравствуйте, есть небольшой скрипт для построения дерева сайта, вот кусок кода, отвечающий за определение хоста (чтоб на другие сайты паук не убежал):
def _checkSameHost(self, *urls):
if not urls:
return None
elif len(urls) == 1:
return True
else:
return all(urlparse.urlparse(url or “”).netloc.split(':') ==
urlparse.urlparse(urls or “”).netloc.split(':') for url in urls)
в чем проблема: криво отрабатывает, часто ошибается
с python не знаком, поэтому прошу помощи в исправлении

Заранее благодарен

Отредактировано zacejuja (Июнь 28, 2017 13:16:23)

Офлайн

#2 Июнь 28, 2017 13:36:02

krok64
Зарегистрирован: 2017-04-04
Сообщения: 75
Репутация: +  11  -
Профиль   Отправить e-mail  

помогите подправить

Странный код. Но если предположить что *urls это список урлов которые надо проверить и

  urls[0]
это урл с которым все остальные проверяются то можно переписать так:
 return all(urlparse.urlparse(url).netloc == urlparse.urlparse(urls[0]).netloc for url in urls[1:])
И еще, если в урле нету двух подряд символов /. как вот здесь http://mnfbvkdsbv, то данный код работать не будет

Отредактировано krok64 (Июнь 28, 2017 13:36:36)

Офлайн

#3 Июнь 28, 2017 13:46:00

zacejuja
Зарегистрирован: 2017-06-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите подправить

спасибо за ответ, но питон что-то злится ; TabError: inconsistent use of tabs and spaces in indentation
Цель данного модуля - сверить получаемые ссылки по домену, если домен не совпадает - игнор. Сделано для того, чтобы софт не пихал в дерево ссылки на googleAD, youtube

Офлайн

#4 Июнь 28, 2017 13:52:06

krok64
Зарегистрирован: 2017-04-04
Сообщения: 75
Репутация: +  11  -
Профиль   Отправить e-mail  

помогите подправить

zacejuja
TabError: inconsistent use of tabs and spaces in indentation
В питоне блоки по степени вложенности разделяются отступом от левого края. Например если описываешь функцию, то все что принадлежит этой функции должно иметь одинаковый отступ больше чем описание функции. Например.
 def _checkSameHost(self, *urls):
    a=b
    c=d
правильно
 def _checkSameHost(self, *urls):
a=b
 c=d
неправильно

Офлайн

#5 Июнь 28, 2017 14:02:49

zacejuja
Зарегистрирован: 2017-06-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите подправить

krok64
спасибо, запустилось
но проблема так и осталась - софт пропускает ссылки, принадлежащие обрабатываемому хосту. Если найдется время, могу в личку скинуть весь скрипт - может понятнее будет?

Офлайн

#6 Июнь 28, 2017 14:09:07

zacejuja
Зарегистрирован: 2017-06-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите подправить

пусть будет тут

 import urllib.parse as urlparse
import logging
IGNORED_EXTENSIONS = [
    # images
    'mng', 'pct', 'bmp', 'gif', 'jpg', 'jpeg', 'png', 'pst', 'psp', 'tif',
    'tiff', 'ai', 'drw', 'dxf', 'eps', 'ps', 'svg', 'ico',
    # audio
    'mp3', 'wma', 'ogg', 'wav', 'ra', 'aac', 'mid', 'au', 'aiff',
    # video
    '3gp', 'asf', 'asx', 'avi', 'mov', 'mp4', 'mpg', 'qt', 'rm', 'swf', 'wmv',
    'm4a',
    # other
    'css', 'pdf', 'doc', 'exe', 'bin', 'rss', 'zip', 'rar', 'js'
]
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
class UrlEliminator(object):
    def __init__(self, entry=None, setting=None):
        self.visited = set()
        self.setting = setting
        if entry:
            self.entry = entry
            self.visited.add(entry)
    def visit(self, url):
        if len(self.visited) == 0:
            self.entry = url
            self.visited.add(url)
            return True
        if self.setting and not self.setting.nocheckhost and \
                not self._checkSameHost(self.entry, url):
            # logger.debug("It's not the same host %s" % url)
            return False
        _url = self._urlRegexize(url)
        # logger.debug("[+]Regexized url %s-->%s" % (url, _url))
        if any(_url.endswith(".%s" % each) for each in IGNORED_EXTENSIONS):
            return False
        if _url in self.visited:
            return False
        self.visited.add(_url)
        return True
    def _checkSameHost(self, *urls):
        if not urls:
            return None
        elif len(urls) == 1:
            return True
        else:
            return all(urlparse.urlparse(url or "").netloc.split(':')[0] ==
                       urlparse.urlparse(urls[0] or "").netloc.split(':')[0] for url in urls[1:])
    def _urlRegexize(self, url):
        # scheme://netloc/path;parameters?query#fragment
        # http://video.sina.com.cn/ent/s/h/2010-01-10/163961994.html?a=1&b=10
        # --> http://video.sina.com.cn/ent/s/h/d+-d+-d+/d+.html?a=&b=
        comp = urlparse.urlparse(url)
        path = comp.path
        i, start = 0, -1
        result = ''
        while i < len(path):
            if '0' <= path[i] <= '9':
                start = i if start == -1 else start
            elif start != -1:
                result += "\d+"
                start = -1
                continue
            else:
                result += path[i]
            i += 1
        if start != -1:
            result += "\d+"
        path = result
        query = ''
        for key in urlparse.parse_qs(comp.query).keys():
            if query != '': query += '&'
            query += (key+'=')
        return urlparse.urlunparse((comp.scheme, comp.netloc, path, comp.params, query, ""))
    def display(self):
        for url in self.visited:
            logger.debug(url)
подправить нужно _checkSameHost, буду крайне благодарен за помощь

Отредактировано zacejuja (Июнь 28, 2017 14:09:51)

Офлайн

#7 Июнь 28, 2017 14:59:14

krok64
Зарегистрирован: 2017-04-04
Сообщения: 75
Репутация: +  11  -
Профиль   Отправить e-mail  

помогите подправить

И как это запускать?

Офлайн

#8 Июнь 28, 2017 15:06:17

zacejuja
Зарегистрирован: 2017-06-28
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

помогите подправить

krok64
это кусок софта, есть skype?

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version