【发布时间】:2020-06-10 21:54:48
【问题描述】:
作为一项编程练习,我正在制作一个小型 Python 工具来在本地下载整个网站。为了能够在本地浏览网站,我需要将所有 URL 转换为相对 URL。否则,资源文件(.js、.css)将从原始网站下载,而不是使用本地下载的版本。由于我需要重写 URL,我想我也可以更改文件层次结构。这导致了这个稍微更笼统的问题:
我怎样才能找到网站中的所有 URL? 基于 http://domain.tld/path 的正则表达式不会删除它,因为 href 属性可能包含相对 URL。
到目前为止,我已经确定了以下几点:
HTML
-
href=<url>(引用) -
src=<url>(引用) srcset=<list>-
action=<url>(引用) -
background=<url>(引用)
CSS
-
url('<url>')或url(<url>)(可以引用也可以不引用) -
@import(<url>)
JS
- 对于 JS,我认为不存在完美的解决方案。使用正则表达式查找完整 URL 似乎是唯一的方法(例如
http://example.tld/path)
[编辑] 另请参阅 this post 以获取一些正则表达式以查找 url。不完整,因为那里没有使用srcset。
【问题讨论】:
-
^(?!mailto:)(?:(?:https?|ftp):\/\/)?(?:\S+(?::\S*)?@)?(?:(?:(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,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)(?::\d{2,5})?(?:\/[^\s]*)?$ -
<a href="//example.com/index.html">link</a>@Edward
标签: html regex url web-scraping w3c