从 URL 列表中选择文件路径的正则表达式
Posted
技术标签:
【中文标题】从 URL 列表中选择文件路径的正则表达式【英文标题】:Regular Expression to select file paths from list of URL 【发布时间】:2018-11-27 15:53:24 【问题描述】:我有一个从随机网站中提取的不同格式的 URL 列表:
http://www.w3.org/2000/svg http://www.w3.org/1999/xlink
/bg-images/png/search-magnifying-glass.png
http://www.boston.com/weather?p1=BGMenu_SubnavBostonGlobe.com
http://www.w3.org/2000/svg
http://www.w3.org/1999/xlink
/bg-images/png/search-magnifying-glass.png http://www.w3.org/2000/svg
http://www.w3.org/1999/xlink
/bg-images/png/bg-logo--full.png
http://www.w3.org/2000/svg
http://www.w3.org/1999/xlink
/bg-images/png/bg-logo--bug.png
https://www.bostonglobe.com
https://www.bostonglobe.com
/metro/2018/06/18/sjc-ruling-millionaires-tax-coming-monday/unxBjYa0JGHKfMKUBzsMjO/story.html?p1=BGHeader_SmartBar_Breaking
/metro/2018/06/18/sjc-ruling-millionaires-tax-coming-monday/unxBjYa0JGHKfMKUBzsMjO/story.html?p1=BGHeader_SmartBar_Breaking
http://www.w3.org/1999/xlink /bg-images/png/bg-logo-large--full.png
http://www.boston.com/section/cars?s_campaign=bg:hp:mainnav:cars
http://realestate.boston.com?s_campaign=bg:hp:mainnav:realestate
http://www.w3.org/2000/svg http://www.w3.org/1999/xlink
它们都采用不同的格式(可选 http/https/www)。我需要对其进行过滤以获取任何类型的“可下载”内容,例如 *jpg、*png、*html 等。
预期输出:
/bg-images/png/search-magnifying-glass.png
/bg-images/png/search-magnifying-glass.png
/bg-images/png/bg-logo--full.png
/bg-images/png/bg-logo--bug.png
/metro/2018/06/18/sjc-ruling-millionaires-tax-coming-monday/unxBjYa0JGHKfMKUBzsMjO/story.html?p1=BGHeader_SmartBar_Breaking
/metro/2018/06/18/sjc-ruling-millionaires-tax-coming-monday/unxBjYa0JGHKfMKUBzsMjO/story.html?p1=BGHeader_SmartBar_Breaking (not sure about these yet just in case)
http://www.w3.org/1999/xlink /bg-images/png/bg-logo-large--full.png
这是我第一次尝试编写正则表达式,我想出了类似的东西:
(https?/\/)?(www\.)?[-a-zA-Z0-9@:;%._\+~\/#=]2,256\.[a-z]2,4a0,1\b([-a-zA-Z0-9@:;!%_\+.,~#?&//=]*)
它输出了很多垃圾行。有什么建议吗?
【问题讨论】:
您为什么不将https://www.bostonglobe.com
视为“可下载内容”?你的标准是什么?
嗯,有很多 URI 没有后缀 *.png 或类似的。图像几乎可以是任何东西。例如,许多 REST 服务使用参数来识别图像:foo.com/image?id=123456
那是你必须从中提取数据的实际文本文件,还是在你发布它时它被劫持了?
通常您会使用修改后的 URL 验证器,并捕获路径。在这种情况下,它位于捕获组 1 中。(?m)^(?!mailto:)(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d1,2|2[0-4]\d|25[0-5]))2(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]+-?)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]2,)))|localhost)(?::\d2,5)?(\/[^\s]+)$
@sln 可以是任何 html 文件,不依赖于此。
【参考方案1】:
由于您的示例 Input_file 在最后一行有空格,所以我使用 sub
删除这些空格,如果它们不存在,那么您可以将其删除。能否请您尝试关注,如果这对您有帮助,请告诉我。
awk 'sub(/ *$/,"")
(/^http/||/^https/||/^www/||/^\//) && \
(/.*png$/||/.*html$/||/.*jpg$/||/BGHeader_SmartBar_Breaking$/)
' Input_file
【讨论】:
@IgorKamalov,很酷,查看此链接如何感谢 SO ***.com/help/someone-answers 上的任何人【参考方案2】:您需要手动检查它们,而不是从一些有问题的提要中获取一些有问题的 URL,因为 URL 通常不包含有关其内容的信息。许多存储服务使用 ID 来识别图像,而不是带有扩展名的名称。但标题确实包含以下信息:
How to get content type of a web address?
那么什么是可下载的?一切。我的意思是字面上你看到的一切都是可下载的。例如,对于图像,内容类型如下所示:
image/gif, image/png, image/jpeg, image/bmp, image/webp
对于音频/视频:
audio/midi, audio/mpeg, audio/webm, audio/ogg, audio/wav
部分完整列表可在此处找到:http://htmlbook.ru/html/value/mime
至于解决方案 - 只需嗅探多个 IO 线程中的每个链接。这样,您还可以首先过滤那些需要一些身份验证、已过期或无效的内容。通常它的请求非常便宜。
【讨论】:
非常感谢您的帮助。我实际上希望为网站选择所有依赖资源。我仍在为这些建立标准。它不一定是所有东西,主要是 CSS javascript 图像和来自 JS 的东西以上是关于从 URL 列表中选择文件路径的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章