Использование Regex и BeautifulSoup в Python для подсчета количества отдельных URL на веб-странице - PullRequest
0 голосов
/ 20 апреля 2020

В настоящее время у меня есть задание на создание сценария 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"

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