我正在编写一个爬网程序来从一些页面中检索一些数据,如何构建它的逻辑对我来说非常清楚,但我对如何正确使用选择器感到非常困惑。
我想用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";元素,该元素是具有包含title的classlist的div元素的子元素,其本身是具有包含所有";行"内容头"非特色";它是main的子元素,是div元素的子元素;glb网格";它是身体元素的子元素。
将其与更简单但更通用的选择器";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)
}
}
这使用了一个简单的选择器来选择所有具有类"的HTML元素;馈送后链接";,其中似乎包含了该页面的所有标题。在这个例子中,我提取了URL以及相应的标题,但这只是简单的说明,如果你不需要,你可以忽略它们。