如何使用linkchecker忽略包含图像格式的URL

时间:2017-07-12 06:53:38

标签: python linkchecker

我正在使用linkchecker抓取英国政府网站,映射超链接之间的关系,并输出到GML文件。

我不想包含图片的网址,例如包含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 个答案:

答案 0 :(得分:2)

花絮:

根据docs

  

- 忽略-URL = REGEX

     

匹配给定正则表达式的网址将被忽略,不会被选中。

     

此选项可以多次给出。

     

LinkChecker接受Python正则表达式。有关简介,请参阅http://docs.python.org/howto/regex.html。   另外一个主要的感叹号否定了正则表达式。

因此,我们可以使用python轻松检查您的正则表达式,看看它为什么不起作用(live test):

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

我认为,这个问题是因为部分匹配,所以让我们尝试完整匹配(patternlive test ):

...
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

解决方案:

正如您所看到的,在您的尝试中,您的网址与给定的正则表达式不匹配,并且不会被忽略。唯一的东西,正则表达式匹配列出的扩展(png,jpg,...)。

要解决此问题,请在.*扩展程序之前匹配所有字符。 另一个问题 - 附上引号。

来自doc的例子:

  

请勿查看mailto:URL。所有其他链接都照常检查:

     

linkchecker --ignore-url = ^ mailto:mysite.example.org

所以你最后的选择是:

--ignore-url=.*(?:png|jpg|jpeg|gif|tiff|bmp|svg|js)$

希望它有所帮助!