неподдерживаемые типы операндов для -: 'str' и 'int': при сравнении имени базового домена и имени дочернего домена на веб-сайте для сканирования - PullRequest
0 голосов
/ 01 ноября 2019

Я пытаюсь выяснить соотношение внутренних ссылок определенного веб-сайта, рассчитав общее количество внутренних ссылок на общее количество ссылок на веб-странице. Если это соотношение> = 0,5, оно вернет -1, в противном случае будетreturn 1.

def get_domain_name(url):
   splitted = urlparse(url).hostname.split('.')
   return  splitted[-2] + '.' + splitted[-1]


def internal_link(url):
   icount = 0
   count = 0

   base_domain_name = get_domain_name(url)
   page = requests.get(url)
   soup = BeautifulSoup(page.content,'html.parser')
   href_links = soup.find_all('a',href=True)
   for link in href_links:
       count = count + 1
       child_domain_name = get_domain_name(link)
       if child_domain_name == base_domain_name:
           icount = icount + 1   

   if count != 0 :
       ilink_ratio = icount/count
        #elink_ratio = 1 - ilink_ratio
   else: 
       ilink_ratio = 0


   if ilink_ratio >= 0.5:
       return -1
   else:
       return 1


ans = internal_link('https://www.google.com')
print(ans)

мой ожидаемый результат будет либо 1, либо -1, но я получаю

ans = internal_link('https://www.google.com')

Traceback (most recent call last):

File "<ipython-input-76-aa8cd733497f>", line 1, in <module>
ans = internal_link('https://www.google.com')

File "<ipython-input-75-36aae0789101>", line 17, in internal_link
child_domain_name = get_domain_name(link)

File "<ipython-input-75-36aae0789101>", line 2, in get_domain_name
splitted = urlparse(url).hostname.split('.')

File "C:\Users\Dell\Anaconda3\lib\urllib\parse.py", line 367, in urlparse
url, scheme, _coerce_result = _coerce_args(url, scheme)

File "C:\Users\Dell\Anaconda3\lib\urllib\parse.py", line 123, in _coerce_args
return _decode_args(args) + (_encode_result,)

File "C:\Users\Dell\Anaconda3\lib\urllib\parse.py", line 107, in _decode_args
return tuple(x.decode(encoding, errors) if x else '' for x in args)

File "C:\Users\Dell\Anaconda3\lib\urllib\parse.py", line 107, in <genexpr>
return tuple(x.decode(encoding, errors) if x else '' for x in args)

File "C:\Users\Dell\Anaconda3\lib\site-packages\bs4\element.py", line 1181, in decode
indent_space = (' ' * (indent_level - 1))

TypeError: unsupported operand type(s) for -: 'str' and 'int'

1 Ответ

0 голосов
/ 01 ноября 2019

Ваша функция get_domain_name не обрабатывает все угловые случаи.

def get_domain_name(url):
   if url:
       print(url)
       hostname = urlparse(url).hostname
       if hostname is not None and '.' in hostname:
           splitted = hostname.split('.')
           return  splitted[-2] + '.' + splitted[-1]

Это может просто сработать. Но вы должны искать другие угловые случаи. Я пробовал только с URL, который вы упомянули в посте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...