正则表达式从URL列表中选择文件路径

时间:2018-06-18 18:39:12

标签: regex awk grep

我有一个从随机网站中提取的不同格式的网址列表:

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)。我需要过滤它以获得任何类型的可下载的#34;内容如* 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,4}a{0,1}\b([-a-zA-Z0-9@:;!%_\+.,~#?&//=]*)

输出大量垃圾线。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

由于您的示例Input_file在最后一行有空格,因此我使用sub删除这些空格,如果它们不存在,则可以将其删除。您可以尝试一下,让我知道这是否对您有所帮助。

awk '{sub(/ *$/,"")}
(/^http/||/^https/||/^www/||/^\//) && \
(/.*png$/||/.*html$/||/.*jpg$/||/BGHeader_SmartBar_Breaking$/)
'  Input_file

答案 1 :(得分:0)

您需要手动检查它们,而不是从某些可疑Feed中提取某些可疑网址,因为一般来说,网址不包含有关其内容的信息。许多存储服务使用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线程中的每个链接。通过这种方式,您还可以过滤那些需要一些身份验证,过期或无效的人。通常是非常便宜的请求。