我希望从Bash中的特定页面获取所有网址。
此问题已在此处解决:Easiest way to extract the urls from an html page using sed or awk only
然而,诀窍是将相对链接解析为绝对链接。因此,如果http://example.com/
包含以下链接:
<a href="/about.html">About us</a>
<script type="text/javascript" src="media/blah.js"></a>
我希望结果具有以下形式:
http://example.com/about.html
http://example.com/media/blah.js
如何尽可能减少依赖?
答案 0 :(得分:7)
简单地说,没有简单的解决方案。具有很少的依赖性导致难看的代码,反之亦然:代码健壮性导致更高的依赖性要求。
考虑到这一点,下面我将描述一些解决方案,并通过提供每个解决方案的优缺点来总结它们。
您可以将wget
的{{1}}选项与一些正则表达式一起使用(了解有关parsing HTML that way的更多信息)。
来自Linux手册:
-k
示例脚本:
-k
--convert-links
After the download is complete, convert the links in the document to
make them suitable for local viewing.
(...)
The links to files that have not been downloaded by Wget will be
changed to include host name and absolute path of the location they
point to.
Example: if the downloaded file /foo/doc.html links to /bar/img.gif
(or to ../bar/img.gif), then the link in doc.html will be modified to
point to http://hostname/bar/img.gif.
优点:
#wget needs a file in order for -k to work
tmpfil=$(mktemp);
#-k - convert links
#-q - suppress output
#-O - redirect output to given file
wget http://example.com -k -q -O "$tmpfil";
#-o - print only matching parts
#you could use any other popular regex here
grep -o "http://[^'\"<>]*" "$tmpfil"
#remove unnecessary file
rm "$tmpfil"
,大多数系统都可以开箱即用。缺点:
您可以将Python与BeautifulSoup一起使用。示例脚本:
wget
然后:
#!/usr/bin/python
import sys
import urllib
import urlparse
import BeautifulSoup
if len(sys.argv) <= 1:
print >>sys.stderr, 'Missing URL argument'
sys.exit(1)
content = urllib.urlopen(sys.argv[1]).read()
soup = BeautifulSoup.BeautifulSoup(content)
for anchor in soup.findAll('a', href=True):
print urlparse.urljoin(sys.argv[1], anchor.get('href'))
优点:
缺点:
dummy:~$ ./test.py http://example.com
,<img src>
,<link src>
等(上面的脚本中未显示)。您可以使用<script src>
的某些功能。 (您在问题中提供的答案中提到了这一点。)示例:
lynx
优点:
缺点:
lynx http://example.com/ -dump -listonly -nonumbers
个链接。您可以使用丑陋的黑客来解决此问题,例如手动将file://localhost/
标记插入HTML。答案 1 :(得分:3)
另一个选项是Xidel (XQuery/Webscraper):
对于所有普通链接:
xidel http://example.com/ -e '//a/resolve-uri(@href)'
对于所有链接和srcs:
xidel http://example.com/ -e '(//@href, //@src)/resolve-uri(.)'
使用rr-格式:
优点:
使用非常简洁。
适用于所有类型的HTML。
这是处理HTML的正确方法,因为它正确使用了完全成熟的解析器。
适用于文件和网址
您可以提供自己的基本网址。 (使用resolve-uri(@href, "baseurl")
)
除了Xidel之外没有任何依赖(除了openssl,如果你还有https网址)
缺点:
答案 2 :(得分:1)