Как игнорировать URL-адреса, содержащие форматы изображений, используя linkchecker
Я использую linkchecker, чтобы сканировать веб-сайт правительства Великобритании, отображать отношения между гиперссылками и выводить их в файл GML.
Я не хочу включать URL-адреса изображений, например, любой URL-адрес, содержащий ссылку на формат файла jpeg или png (например, "www.gov.uk/somefile.jpeg").
Я пытался часами добиться этого, используя --ignore-url
параметр командной строки и различные регулярные выражения. Вот моя последняя попытка, прежде чем сдаться:
linkchecker --ignore-url='(png|jpg|jpeg|gif|tiff|bmp|svg|js)$' -r1 --verbose --no-warnings -ogml/utf_8 --file-output=gml/utf_8/www.gov.uk_RECURSION_1_LEVEL_NO_IMAGES.gml https://www.gov.uk
Может ли кто-нибудь посоветовать, если это возможно, и если да, то предложить решение?
1 ответ
Общая информация:
Согласно документам:
--ignore-URL = REGEX
URL-адреса, соответствующие заданному регулярному выражению, будут игнорироваться и не проверяться.
Эта опция может быть дана несколько раз.
LinkChecker принимает регулярные выражения Python. См. http://docs.python.org/howto/regex.html для ознакомления. Кроме того, ведущий восклицательный знак отрицает регулярное выражение.
Таким образом, мы можем легко проверить ваше регулярное выражение с python, чтобы понять, почему оно не работает ( живой тест):
import re
our_pattern = re.compile(r'(png|jpg|jpeg|gif|tiff|bmp|svg|js)$')
input_data = '''
www.gov.uk/
www.gov.uk/index.html
www.gov.uk/admin.html
www.gov.uk/somefile.jpeg
www.gov.uk/anotherone.png
'''
input_data = input_data.strip().split('\n')
for address in input_data:
print('Address: %s\t Matched as Image: %s' % (address, bool(our_pattern.match(address))))
# ^ or our_pattern.fullmatch
Выход:
Address: www.gov.uk/ Matched as Image: False
Address: www.gov.uk/index.html Matched as Image: False
Address: www.gov.uk/admin.html Matched as Image: False
Address: www.gov.uk/somefile.jpeg Matched as Image: False
Address: www.gov.uk/anotherone.png Matched as Image: False
И я думаю, что проблема здесь из-за частичного совпадения, поэтому давайте попробуем полное совпадение ( шаблон, живой тест):
...
our_pattern = re.compile(r'.*(?:png|jpg|jpeg|gif|tiff|bmp|svg|js)$')
# ^ Note this (matches any character unlimited times)
...
... и вывод:
Address: www.gov.uk/ Matched as Image: False
Address: www.gov.uk/index.html Matched as Image: False
Address: www.gov.uk/admin.html Matched as Image: False
Address: www.gov.uk/somefile.jpeg Matched as Image: True
Address: www.gov.uk/anotherone.png Matched as Image: True
Решение:
Как видите, в вашей попытке ваши URL не соответствуют заданному регулярному выражению и не игнорируются. Единственное, что соответствует этому регулярному выражению, это перечисленные расширения (png, jpg, ...).
Чтобы преодолеть эту проблему - сопоставьте все символы перед расширениями с .*
, Еще одна проблема - вложение цитат.
Из примеров документа:
Не проверяйте mailto: URL. Все остальные ссылки проверяются как обычно:
linkchecker --ignore-url = ^ mailto: mysite.example.org
Итак, ваш последний вариант:
--ignore-url=.*(?:png|jpg|jpeg|gif|tiff|bmp|svg|js)$
Надеюсь, поможет!