0%

goquery的使用-类似于Python的lxml库

goquery的使用-类似于Python的lxml库:

// goquery 常规用法

// strings.NewReader(html):将字符串html转换为一个Reader接口,这样goquery可以从这个字符串中读取HTML内容。
// goquery.NewDocumentFromReader(...):使用goquery库从提供的Reader接口中解析HTML,并创建一个新的goquery文档对象。这个函数返回两个值,第一个是解析后的文档对象,第二个是可能出现的错误。在这里,错误值被忽略(使用_)。
dom, _ := goquery.NewDocumentFromReader(strings.NewReader(html))

// om.Find("tr"):在解析后的HTML文档中查找所有的<tr>元素。
// EachWithBreak(...):对找到的每一个<tr>元素执行一个函数。这个函数可以返回一个布尔值来决定是否继续迭代。如果返回false,则停止迭代。
dom.Find("tr").EachWithBreak(func(i int, s *goquery.Selection) bool {

// s.Find("a"):在当前<tr>元素内查找所有的<a>标签。
// .Eq(0):选择第一个找到的<a>标签。
// .Text():获取该<a>标签的文本内容,并将其赋值给_title。
_title := s.Find("a").Eq(0).Text()

// s.Find("td"):在当前<tr>元素内查找所有的<td>元素。
// .Eq(2):选择第三个<td>元素(索引从0开始)。
// .Text():获取该<td>元素的文本内容,并将其赋值给_author。
_author := s.Find("td").Eq(2).Text()

//判断当前<tr>元素中的标题(<a>标签的文本)是否等于name,并且作者(第三个<td>元素的文本)是否等于author
if _title == name && _author == author {

// 获取当前<tr>元素中第一个<a>标签的href属性。url是属性的值,exists是一个布尔值,表示该属性是否存在。
url, exists := s.Find("a").Eq(0).Attr("href")

// 如果href属性不存在,则执行括号内的代码。但注意,这里的逻辑可能有些问题,因为当href不存在时,程序会记录一个致命错误并退出,这可能不是预期的行为。通常,我们可能只想跳过当前循环或记录一个非致命的错误。
if !exists {
Err = nil
log.Fatal(exists)
}

// 如果找到了匹配的标题和作者,且<a>标签有href属性,则将url赋值给targetUrl
targetUrl = url
}
//在EachWithBreak的回调函数结束时返回true,表示继续迭代下一个<tr>元素。如果想在某个条件下停止迭代,可以返回false
return true
})