Основная причина, по которой это не работает, заключается в том, что вы помещаете записи OK и ERROR внутри блока except.
Это означает, что будут сохранены только URL-адреса, которые действительно вызывают исключение.
В общем, я бы посоветовал вам распылить некоторые операторы печати на разных этапах сценария - или использовать IDE, которая позволяет вам выполнять код во время выполнения - построчно. Это значительно упрощает отладку подобных вещей.
PyCharm бесплатен и позволяет вам это делать. Попробуйте.
Итак - я не работал с urllib, но часто использую запросы (python -m pip install requests). Быстрый рефакторинг с использованием этого будет выглядеть примерно так:
import requests
from bs4 import BeautifulSoup
import re
url = "http://www.google.com"
r = requests.get(url)
html = r.text
soup = BeautifulSoup(html, "lxml")
links = soup.find_all("a", attrs={'href': re.compile('^(http://)')})
for link in links:
href = link["href"]
print("Testing for URL {}".format(href))
try:
# since you only want to scan for status code, no need to pull the entire html of the site - use HEAD instead of GET
r = requests.head(href)
status = r.status_code
# 404 etc will not yield an error
error = None
except Exception as e:
# these exception will not have a status_code
status = None
error = e
# store the finding in your files
if status is None or status != 200:
print("URL is broken. Writing to ERROR_Doc")
# do your storing here of href, status and error
else:
print("URL is live. Writing to OK_Doc"
# do your storing here
Надеюсь, это имеет смысл.