В настоящее время у меня есть задание на создание сценария Python, который может искать количество уникальных URL-адресов на веб-странице и предоставлять счетчик. Задача этого задания - использовать регулярное выражение для поиска URL-адресов, поэтому оно присутствует в коде независимо от того, могут ли быть более эффективные альтернативные методы (например, использование тегов href).
Предполагается, что URL-адрес будет заключен в код. двумя кавычками (например, или), поэтому мне не нужно было бы подсчитывать случаи, такие как "mtv (http://mtv.com)".
Ссылки на локальный файл, например / news, / sports , / Rankings не будет учитываться как отдельные URL-адреса, в то время как аргументы URL-адреса, например,? login = misterT и? login = missesK, будут считаться двумя разными URL-адресами.
Вот что у меня есть:
import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import re
import ssl
import sys
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
#Ask the user for URL:
url = input('Enter the URL you would like to check: ')
try:
html = urllib.request.urlopen(url, context=ctx).read()
soup = BeautifulSoup(html, 'html.parser')
except:
print("Cannot access - please check your URL!")
sys.exit()
#Initialize counter
count = 0
##Search for http, whether or not it is secure, optional www group, any one or more word character after,
##any one word character one or more times(Groups for domain, then .com, .org, .gov, etc.), followed by forward slash,
##followed by any one word character one or more times,
##followed by a question mark (to account for arguments in URLs), enclosed by double quotes, regardless of case
def websitecount(url):
re_flags = ( re.MULTILINE | re.IGNORECASE | re.UNICODE )
websites = re.findall('/(http|https)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/', str(soup), re_flags)
return len(websites)
#Count the number of unique URLs
print('The count of unique URLs is:', websitecount(url))
Когда я выполняю код, я получаю ошибку «TypeError: ожидаемая строка или байтовоподобный объект» в строке регулярного выражения (website = re.findall). Как я мог подумать об изменении кода для достижения sh моей желаемой цели?
Редактировать: я изменил код, чтобы использовать функцию, но я все еще получаю возвращаемое значение 0. Например, когда я вхожу URL-адрес этой цепочки, который должен возвращать значение 4, учитывая следующие 4 URL-адреса:
"http://www.google.com/query?id=232"
"http://www.google2.com/id?login=222"
"http://www.google3.com/iwow?login=2312"
"http://www.mtv.com/id?login=483984"