首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Google搜索结果页面中提取URL

问从Google搜索结果页面中提取URL
EN

Stack Overflow用户
提问于 2015-06-04 05:02:06
回答 1查看 4.7K关注 0票数 1

我正试图从Google搜索页面中抓取所有的URL,有两种方法我认为我可以做到,但我真的不知道该如何做。

First,我可以简单地从.r标记中抓取它们,并为每个链接获取href属性。但是,这给了我一个非常长的字符串,我需要解析这个字符串才能获得URL。下面是一个需要分析的例子:

https://www.google.com/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=mh4u%20items&oq=mh4u%20items&aqs=chrome.0.0l2j69i59j69i60j0l2.1754j0j7/url?q=https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/&sa=U&ei=n8NvVdSvBMOsyATSzYKoCQ&ved=0CEUQFjAL&usg=AFQjCNGyD5NjsqOncyLElJt9C0hqVQ7gyA

我想要的URL是:

https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/

所以我必须在https和&sa之间创建一个字符串,我不能100%确定该如何做,因为谷歌给我的每一个真正长的字符串都有不同的大小,所以只使用切片并将它切成"x“字符是行不通的。

第二,在谷歌搜索的每个链接下面都有绿色文本的网址。右键单击该元素并检查该元素会得到:cite class="_Rm" (在chevron之间),我不知道如何使用goquery查找它,因为使用我的小函数查找cite只会给我提供更长的字符串字符。

下面是我的小函数,它目前不需要解析就执行第一个选项,并给出了一长串文本,它只带我到搜索页面:

代码语言:javascript
复制
func GetUrls(url string) {

    doc, err := goquery.NewDocument(url)

    if err != nil {
        panic(err)
    }

    doc.Find(".r").Each(func(i int, s *goquery.Selection) {

        doc.Find(".r a").Each(func(i int, s *goquery.Selection) {
            Link, _ := s.Attr("href")
            Link = url + Link
            fmt.Printf("link is [%s]\n", Link)
        })

    })

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-04 06:27:45

标准库支持解析URL。查看net/url包。使用这个包,我们可以从URL中获取查询参数。

注意,原始URL包含要在"aqs"参数中提取的URL,格式为

代码语言:javascript
复制
chrome.0.0l2j69i59j69i60j0l2.1754j0j7/url?q=https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/

这基本上是另一个URL。

让我们编写一个小助手函数,它从原始URL文本中获取一个参数:

代码语言:javascript
复制
func getParam(raw, param string) (string, error) {
    u, err := url.Parse(raw)
    if err != nil {
        return "", err
    }

    q := u.Query()
    if q == nil {
        return "", fmt.Errorf("No query part")
    }

    v := q.Get(param)
    if v == "" {
        return "", fmt.Errorf("Param not found")
    }
    return v, nil
}

使用这种方法,我们可以从原始URL中获得"aqs"参数,再使用它,我们可以得到"q"参数,这正是您想要的URL:

代码语言:javascript
复制
raw := "https://www.google.com/search?sourceid=chrome-psyapi2&ion=1&espv=2&ie=UTF-8&q=mh4u%20items&oq=mh4u%20items&aqs=chrome.0.0l2j69i59j69i60j0l2.1754j0j7/url?q=https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/&sa=U&ei=n8NvVdSvBMOsyATSzYKoCQ&ved=0CEUQFjAL&usg=AFQjCNGyD5NjsqOncyLElJt9C0hqVQ7gyA"
aqs, err := getParam(raw, "aqs")
if err != nil {
    panic(err)
}
fmt.Println(aqs)

result, err := getParam(aqs, "q")
fmt.Println(result)

输出(在围棋游乐场上尝试):

代码语言:javascript
复制
chrome.0.0l2j69i59j69i60j0l2.1754j0j7/url?q=https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/
https://youknowumsayin.wordpress.com/2015/03/16/the-inventory-and-you-what-items-should-i-bring-mh4u/
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30635272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档