1

需要从包含大量条目、一些 .com .us 等的文件中提取 .co.uk 网址。我只需要 .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/"

认为我很接近

谢谢!

4

3 回答 3

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

如果您只对唯一的 url 感兴趣,请将输出通过管道传输到sort -u

高温高压

于 2012-06-26T00:07:39.363 回答
0

由于还没有答案,我可以为您提供一个丑陋但强大的解决方案。您可以利用该wget命令来获取文件中的 URL。通常,wget用于从这些 URL 下载,但通过拒绝wget它通过 DNS 查找的时间,它不会解析任何内容而只是打印 URL。然后,您可以对其中包含 .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,那么你可以在这里得到它

于 2012-06-25T13:24:40.733 回答
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(基于文本的网络浏览器)实际上检索该站点。
    • Using-dump导致渲染的页面被发送到标准输出。
    • 使用-html-numbered-links请求编号的链接表。
    • 使用-anonymous调整默认值来增加安全性。
  • tac在行序列表中反转 Links 的输出
  • sed -e '/^Links:/,$ d'删除链接表之后(预反转,之前)的所有内容,确保实际页面内容不会被错误解析
  • sed -e 's/[0-9]\+.[[:space:]]//'从各个链接中删除编号的标题。
  • grep '^https\?://[^/]\+[.]co[.]uk'仅查找其主机部分以 . 结尾的链接.co.uk
于 2012-06-26T00:28:40.773 回答