2011-03-20 38 views
4

我想解析下载网页的来源以获取链接列表。单线可以很好地工作。以下是我迄今为止所尝试的内容:使用awk sed或grep从网页源解析网址

这似乎忽略了某些网页名称的部分网址。

$ cat file.html | grep -o -E '\b(([\w-]+://?|domain[.]org)[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/)))'|sort -ut/ -k3 

这将获得所有的URL,但我不想包含具有锚链接的链接。此外,我希望能够指定domain.org/folder/:

$ awk 'BEGIN{ 
RS="</a>" 
IGNORECASE=1 
} 
{ 
    for(o=1;o<=NF;o++){ 
    if ($o ~ /href/){ 
     gsub(/.*href=\042/,"",$o) 
     gsub(/\042.*/,"",$o) 
     print $(o) 
    } 
    } 
}' file.html 
+1

http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – 2011-03-20 15:14:46

+0

'grep -E'不理解非捕获子模式或' \ w'在字符类中转义。你需要使用'grep -P'。 – 2011-03-20 16:17:29

+0

@丹尼斯威廉姆森:现在返回的结果与第二个例子类似,但我需要能够清除锚链接并指定http://domain.com/folder – Astron 2011-03-20 16:21:40

回答

8

如果你只解析像<一>标签,你可以只匹配href属性是这样的:

$ cat file.html | grep -o -E 'href="([^"#]+)"' | cut -d'"' -f2 | sort | uniq 

这将忽略锚,并保证你有独特的。这确实假定该页面具有格式良好的(X)HTML,但您可以先将其传递给Tidy。

+0

,其工作方式与我发布的第二个示例类似我正在寻找一种方法来修剪锚链接的结果。 http://domain.com/folder/link.html http://domain.com/folder/link.html#anchor **不可取** – Astron 2011-03-20 15:45:45

+0

@Astron,好的,我编辑了我的回复以解决这个问题问题。 – mjbommar 2011-03-20 16:26:52

+0

很好,但现在它似乎包含其他链接(也许我以前没有注意到它们。grep语句是否也指定了domain.com/folder/?谢谢 – Astron 2011-03-20 16:31:35

2
lynx -dump http://www.ibm.com 

并期待在输出字符串“引用”。如果需要,可以使用sed进行后期处理。

使用不同的工具有时会使工作变得更简单。偶尔,不同的工具会使工作变得简单。这是其中的一次。