从curl'd结果中提取特定字符串

时间:2010-06-13 02:54:54

标签: bash grep

鉴于此curl命令:     curl --user-agent“fogent”--silent -o page.html“http://www.google.com/search?q=insansiate

*拼写故意不正确。我想把这个建议作为我的结果。

我希望能够使用grep -oE grep进入page.html文件,或者直接从curl传出它,并且永远不会存储文件。

结果应该是:'实例化'

我只需要'实例'这个词,或者谷歌自动更正的短语就是我所追求的。

这是返回的基本html:

<span class=spell style="color:#cc0000">Did you mean: </span><a href="/search?hl=en&amp;ie=UTF-8&amp;&amp;sa=X&amp;ei=VEMUTMDqGoOINraK3NwL&amp;ved=0CB0QBSgA&amp;q=instantiate&amp;spell=1"class=spell><b><i>instantiate</i></b></a>&nbsp;&nbsp;<span class=std>Top 2 results shown</span>

所以也许来自下面的字符串,我希望它足够独特,可以涵盖我的所有基础。

class=spell><b><i>instantiate</i></b></a>&nbsp;&nbsp;

我一直遇到贪婪的grep问题;也许我应该通过一个html美化工具来运行它,首先获得一个换行符或50。我不知道有什么简单的方法可以在bash中这样做,这就是我理想的情况。我真的不想处理启动perl,并确保我有正确的模块。 / p>

有任何建议,谢谢?

4 个答案:

答案 0 :(得分:4)

我确信你知道,屏幕抓取是一件微妙的事情。此命令序列也不例外,因为它依赖于页面的特定结构,该结构可能随时更改,恕不另行通知。

grep -o 'Did you mean:\([^>]*>\)\{5\}' page.html | sed 's/.*<i>\([^<]*\)<.*/\1/' page.html

在管道中:

curl --user-agent "fogent" --silent "http://www.google.com/search?q=insansiate" | grep -o 'Did you mean:\([^>]*>\)\{5\}' page.html | sed 's/.*<i>\([^<]*\)<.*/\1/'

这取决于找到五个“&gt;” “你的意思是:”之间的字符和你正在寻找的字之后的“</i>”。

您是否考虑过其他获取拼写建议的方法,或者您对Google提供的内容特别感兴趣?

如果您安装了ispell或aspell,则可以执行以下操作:

echo insansiate | ispell -a

并解析结果。

答案 1 :(得分:1)

xidel 是抓取网页的绝佳工具;它支持检索页面并以各种查询语言(CSS选择器,XPath)提取信息。

在目前的情况下,简单的CSS选择器a.spell将起到作用。

xidel --user-agent "fogent" "http://google.com/search?q=insansiate" -e 'a.spell'

请注意xidel如何进行自己的网页检索,因此在这种情况下不需要curl

但是,如果您需要curl来获取更多异国情调的检索选项,请按以下步骤组合使用这两种工具(换行符为可读性):

curl --user-agent "fogent" --silent "http://google.com/search?q=insansiate" |
xidel - -e 'a.spell'

答案 2 :(得分:0)

curl - &gt; tidy -asxml - &gt; xmlstarlet sel

答案 3 :(得分:0)

编辑:抱歉,没有看到您的Perl通知。

#!的/ usr / bin中/ perl的     用严格;     使用LWP :: UserAgent;

my $arg = shift // 'insansiate';

my $lwp = LWP::UserAgent->new(agent => 'Mozilla');
my $c = $lwp->get("http://www.google.com/search?q=$arg") or die $!;

my @content = split(/:/, $c->content);

for(@content) {
  if(m;<b><i>(.+)</i></b>;) {
    print "$1\n";
    exit;
    }
}

<强>运行:

 > perl google.pl 
    instantiate
 > perl google.pl disconect
    disconnect