如何正确使用选择器
How to use selectors properly
我正在编写一个爬虫来从某些页面检索一些数据,如何构建它的逻辑对我来说非常清楚,但我对如何正确使用选择器感到很困惑。
我想使用 colly 获取一些新闻的标题,我转到页面 https://g1.globo.com/economia 并检查了我想提取信息的标题 -> 单击检查 -> 复制选择器。
选择器是
body > 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 文档中找不到与此相关的任何内容。
选择器并非特定于 colly。它正在使用 goquery 的查找功能:
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 元素的 child,其中包含标题的 class 列表本身是 child div 元素有一个 class 列表,其中包含所有“行”、“content-head”、“non-featured”,这是主要的 child,那是div 元素的 child,class 列表包含“glb-grid”,这是 body 元素的 child。
将此与更简单但更通用的选择器“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)
}
}
这使用了一个简单的选择器,它选择所有 class 为“feed-post-link”的 HTML 元素,这似乎包括该页面的所有标题。我在这个例子中提取了 URL 以及相应的标题,但这只是简单的说明,如果这不是您需要的,您可以忽略它们。
我正在编写一个爬虫来从某些页面检索一些数据,如何构建它的逻辑对我来说非常清楚,但我对如何正确使用选择器感到很困惑。
我想使用 colly 获取一些新闻的标题,我转到页面 https://g1.globo.com/economia 并检查了我想提取信息的标题 -> 单击检查 -> 复制选择器。
选择器是
body > 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 文档中找不到与此相关的任何内容。
选择器并非特定于 colly。它正在使用 goquery 的查找功能:
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 元素的 child,其中包含标题的 class 列表本身是 child div 元素有一个 class 列表,其中包含所有“行”、“content-head”、“non-featured”,这是主要的 child,那是div 元素的 child,class 列表包含“glb-grid”,这是 body 元素的 child。
将此与更简单但更通用的选择器“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)
}
}
这使用了一个简单的选择器,它选择所有 class 为“feed-post-link”的 HTML 元素,这似乎包括该页面的所有标题。我在这个例子中提取了 URL 以及相应的标题,但这只是简单的说明,如果这不是您需要的,您可以忽略它们。