为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确使用选择器

如何正确使用选择器

Go
汪汪一只猫 2022-07-11 16:44:02
我正在编写一个爬虫来从某些页面中检索一些数据,如何构建它的逻辑对我来说非常清楚,但我对如何正确使用选择器感到非常困惑。我想使用 colly 获取一些新闻的标题,我转到页面https://g1.globo.com/economia并检查了我要提取信息的标题 -> 单击检查 -> 复制选择器。选择器是正文 > div.glb-grid > main > div.row.content-head.non-featured > div.title > h1我怎样才能把它正确地放在这行代码中?detailCollector.OnHTML("body >  div.glb-grid > main > div.row.content-head.non-featured > div.title > h1", func(element *colly.HTMLElement) {    fmt.Println(element.Text)})如何以 colly 可以理解的方式解析这个选择器的正确方法?我在 colly 文档中找不到与此相关的任何内容。
查看完整描述

1 回答

?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

选择器并非特定于 colly。它使用goquery的 Find 功能:


doc.Find(cc.Selector).Each(func(_ int, s *goquery.Selection)

但是您提供的示例代表了 CSS 选择器。因此,您可以在此处找到标准中的最终参考:https ://www.w3.org/TR/selectors-3/#selectors


但是该特定网页似乎不包含您在上面寻找的选择器。


您提供的示例非常具体,这可能就是它不匹配任何内容的原因。将其分解为:


body >  div.glb-grid > main > div.row.content-head.non-featured > div.title > h1

找到一个“h1”元素,它是一个 div 元素的子元素,其 classlist 包含 title,它本身是 div 元素的子元素,其 classlist 包含所有“row”、“content-head”、“non -featured”,它是 main 的子元素,它是 div 元素的子元素,其类列表包含作为 body 元素的子元素的“glb-grid”。


将此与更简单但更通用的选择器“h1”进行对比,后者仅产生网页标题,因为它似乎是文档中唯一的“h1”元素,这可能会解释您的困惑。


<h1 class="header-title"> 

<div class="header-title-content">

<a class="header-editoria--link" href="https://g1.globo.com/economia/">Economia</a>

</div>

</h1>

除此之外,页面使用 Javascript 调整 DOM,并且您对页面上实际存在的内容有些移动目标。


但是,这并不全是坏消息,因为我怀疑您正在寻找的物品可能只需要:-


package main


import (

    "fmt"


    "github.com/gocolly/colly"

)


func main() {

    headlines := make(map[string]string)

    c := colly.NewCollector()

    c.OnHTML(".feed-post-link", func(e *colly.HTMLElement) {

        headlines[e.Text] = e.Attr("href")

    })


    c.Visit("https://g1.globo.com/economia")

    for hl, url := range headlines {

        fmt.Printf("'%v' - (%v)\n", hl, url)

    }

}

这使用了一个简单的选择器,它选择所有具有“feed-post-link”类的 HTML 元素,这似乎包括该页面的所有标题。我已经提取了此示例中的 URL 以及相应的标题,但这只是说明性的,如果这不是您需要的,您可以忽略它们。


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 115 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信