从HTML文件中提取.co.uk网址

时间:2012-06-25 03:48:49

标签: bash url tld

需要从包含大量条目的文件中提取.co.uk网址,一些.com .us等。我只需要.co.uk。任何方式这样做? pd:我正在学习bash

编辑:

代码示例:

<a href="http://www.mysite.co.uk/" target="_blank">32</a>
<tr><td id="Table_td" align="center"><a href="http://www.ultraguia.co.uk/motets.php?pg=2" target="_blank">23</a><a name="23"></a></td><td id="Table_td"><input type="text" value="http://www.ultraguia.co.uk/motets.php?pg=2" size="57" readonly="true" style="border: none"></td>

注意一些重复

重要:我需要所有链接,破坏或404也是

在网上找到了这个代码:

cat file.html | tr " " "\n" | grep .co.uk

输出:

href="http://www.domain1.co.uk/"
value="http://www.domain1.co.uk/"
href="http://www.domain2.co.uk/"
value="http://www.domain2.co.uk/"

认为我很接近

谢谢!

3 个答案:

答案 0 :(得分:0)

由于还没有答案,我可以为您提供一个丑陋而强大的解决方案。您可以利用wget命令获取文件中的URL。通常,wget用于从该网址下载,但是通过拒绝wget时间通过DNS查找,它将无法解析任何内容并只打印网址。然后,您可以在那些包含.co.uk的URL上进行grep。整个故事变成:

wget --force-html --input-file=yourFile.html --dns-timeout=0.001 --bind-address=127.0.0.1 2>&1 | grep -e "^\-\-.*\\.co\\.uk/.*"

如果您想要删除每一行的剩余时间戳信息,您可以通过sed管道输出,如| sed 's/.*-- //'

如果您没有wget,那么您可以获得here

答案 1 :(得分:0)

使用awk的一种方式:

awk -F "[ \"]" '{ for (i = 1; i<=NF; i++) if ($i ~ /\.co\.uk/) print $i }' file.html

输出:

http://www.mysite.co.uk/
http://www.ultraguia.co.uk/motets.php?pg=2
http://www.ultraguia.co.uk/motets.php?pg=2

如果您只对唯一网址感兴趣,请将输出传输到sort -u

HTH

答案 2 :(得分:0)

以下方法使用真正的HTML引擎来解析HTML,因此面对CDATA部分或其他难以解析的语法会更可靠:

links -dump http://www.google.co.uk/ -html-numbered-links 1 -anonymous \
  | tac \
  | sed -e '/^Links:/,$ d' \
        -e 's/[0-9]\+.[[:space:]]//' \
  | grep '^http://[^/]\+[.]co[.]uk'

它的工作原理如下:

  • links(基于文本的Web浏览器)实际检索该网站。
    • 使用-dump会将呈现的页面发送到stdout。
    • 使用-html-numbered-links请求编号的链接表。
    • 使用-anonymous调整默认值以增加安全性。
  • tac撤消行排序列表中链接的输出
  • sed -e '/^Links:/,$ d'删除链接表之后(转换之前,之前)的所有内容,确保实际页面内容不会被错误分析
  • sed -e 's/[0-9]\+.[[:space:]]//'从各个链接中删除编号的标题。
  • grep '^https\?://[^/]\+[.]co[.]uk'仅查找以.co.uk结尾的主机部分的链接。
相关问题