Python从字符串中获取url(正则表达式)

时间:2018-02-05 08:03:36

标签: python

所以我要做的是从HTTP请求列表中提取所有URL。应该在路径末尾删除它们的协议,参数和斜杠(如果存在)。例如:

10.4.180.222 [5/Feb/2018:08:03:40 +0100] "GET http://somewebsite.com/ HTTP/1.1" 200 1080
10.4.180.222 [5/Feb/2018:08:03:11 +0100] "GET http://www.somewebsite.cc/somesubdomain/ HTTP/1.1" 200 3056
10.4.180.222 [5/Feb/2018:08:03:11 +0100] "GET https://www.somewebsite.ua HTTP/1.1" 200 3056

应该是:

somewebsite.com
www.somewebsite.cc/somepath
www.somewebsite.ua

我已尝试分两步完成此操作,而不使用任何复杂的正则表达式(只适用于任何网址)

urls = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', file.read())

然后使用urlparse。

domain = '{url.netloc}{url.path}'.format(url=urlparse(url))

它几乎没用。但是我的路径以斜线结尾。

www.somewebsite.cc/somepath/

所以我决定使用正则表达式。但是,我只知道基础知识,所以我不能提出任何运作良好的东西。现在我有类似的东西,但它并没有覆盖" /"事情和不同的协议:/

感谢您的任何建议:)

((?:www\.+)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-]*))

1 个答案:

答案 0 :(得分:0)

如果结束斜线是您唯一的问题,那就是解决方案。

urls = [ x.rstrip('/') for x in re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', file.read()) ]

换句话说,就这样做

  

urls = [x.rstrip('/')for x in <你的正则表达式在这里> ]。