Как игнорировать 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)$

Надеюсь, поможет!

Другие вопросы по тегам