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

tim*_*ham 3 python linkchecker

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

我不想包含图像的 URL,例如任何包含 jpeg 或 png 文件格式引用的 URL(例如“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
Run Code Online (Sandbox Code Playgroud)

有人可以建议这是否可能吗?如果可以,请提出解决方案?

Com*_*nse 5

琐事:

根据文档

--ignore-url=正则表达式

与给定正则表达式匹配的 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
Run Code Online (Sandbox Code Playgroud)

输出:

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
Run Code Online (Sandbox Code Playgroud)

我认为,这里的问题是因为部分匹配,因此让我们尝试完全匹配(模式实时测试):

...
our_pattern = re.compile(r'.*(?:png|jpg|jpeg|gif|tiff|bmp|svg|js)$')
#                          ^ Note this (matches any character unlimited times)
...
Run Code Online (Sandbox Code Playgroud)

...输出是:

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
Run Code Online (Sandbox Code Playgroud)

解决方案:

正如您所看到的,在您的尝试中,您的 URL 与给定的正则表达式不匹配,因此不会被忽略。唯一与正则表达式匹配的是列出的扩展名(png,jpg,...)。

要解决此问题 - 将扩展名之前的所有字符与.*. 另一个问题 - 包含引号。

从文档的例子:

不要检查 mailto: URL。所有其他链接都照常检查:

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

所以你的最终选择是:

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

希望能帮助到你!