Давайте проясним некоторые вещи. A Selection
представляет собой набор узлов, соответствующих некоторым критериям.
doc.Find()
является Selection.Find()
, который возвращает новый Selection
содержащий элементы, соответствующие критериям. И Selection.Each()
итераций по каждому из элементов коллекции и вызывает переданное ему значение функции.
Так что в вашем случае Find("tbody")
найдут все tbody
элементов, Each()
будет перебрать все элементы tbody
и вызвать вашу анонимную функцию.
Внутри вашей анонимной функции s
является Selection
одного tbody
элемент. Вы звоните s.Find("td")
, который вернет новый Selection
, который будет содержать всеtd
элементы текущей таблицы. Поэтому, когда вы вызываете Text()
, это будет комбинированное текстовое содержимое каждого из td
элементов, включая их потомков. Это не то, что вы хотите.
Что вы должны сделать, это позвонить другому Each()
на номер Selection
, указанный 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
ребенка каждой строки, проверяя, если индекс передается на 3-й анонимной функции 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())
})
})
})
Вы можете найти 'td' без какого-либо дочернего элемента' a'. –
Хорошо, я могу попытаться выяснить, как это сделать. Я просто попробовал нарезать заголовок, чтобы получить 4 первых символа, потому что все они начинаются с «