1 回答
TA贡献1893条经验 获得超10个赞
让我们澄清一些事情。ASelection是匹配某些条件的节点的集合。
doc.Find()isSelection.Find()返回一个Selection包含与条件匹配的元素的新元素。并Selection.Each()迭代集合的每个元素并调用传递给它的函数值。
因此,在您的情况下,Find("tbody")将找到所有tbody元素,Each()将遍历所有tbody元素并调用您的匿名函数。
在您的匿名函数中s是Selection一个tbody元素。你叫s.Find("td")这将返回一个新的Selection,这将包含所有的td当前表的元素。所以当你调用Text()这个时,它将是每个td元素的组合文本内容,包括它们的后代。这不是你想要的。
您应该做的是Each()在Selection返回的 by上调用另一个s.Find("td")。并检查Selection传递给第二个匿名函数是否有img子函数。
示例代码:
doc.Find("tbody").Each(func(i int, s *goquery.Selection) {
// s here is a tbody element
s.Find("td").Each(func(j int, s2 *goquery.Selection) {
// s2 here is a td element
if s3 := s2.Find("img"); s3 != nil && s3.Length() > 0 {
return // This TD has at least one img child, skip it
}
fmt.Printf(s2.Text())
})
})
或者,您可以通过检查传递给第三个匿名函数的索引是否为(第一个子项)来搜索tr元素并跳过td每行的0第一个子项,如下所示:
doc.Find("tbody").Each(func(i int, s *goquery.Selection) {
// s here is a tbody element
s.Find("tr").Each(func(j int, s2 *goquery.Selection) {
// s2 here is a tr element
s2.Find("td").Each(func(k int, s3 *goquery.Selection) {
// s3 here is a td element
if k == 0 {
return // This is the first TD in the row
}
fmt.Printf(s3.Text())
})
})
})
- 1 回答
- 0 关注
- 190 浏览
添加回答
举报