0

我需要抓取一个我感兴趣的标签的网站:

    <script type="myjson">
        [{"class": "companyname", "location"....and so on
    </script>

目前我正在使用以下代码片段完成工作(goquery):

        doc.Find("script").Each(func(i int, element *goquery.Selection) {
        _, exists := element.Attr("type")
        if exists {
                var filepath string
                filepath = "mypath" 
                
                file, err := os.Create(filepath)
                if err != nil {
                    panic("COULD NOT CREATE FILE")  
                }               
                file.WriteString(element.Text())
                fmt.Println(element.Text())
                file.Close()

这段代码的问题是,虽然 element.Text() 被正确打印到标准输出(它打印一个长切片,里面有几个 json,我需要打印到一个文件以供以后工作),但 file.WriteString 语句不打印文件中的任何内容。该文件仍然是空的。

看来我的查询是错误的,它输出了 2 个元素;第一个长度为零,这是打印到文件的内容,第二个是实际内容,打印到标准输出但不打印到文件。

您能否建议对我的代码进行更正,以便将内容正确打印到文件中?我猜我的 goquery 查询中可能有错误。

4

1 回答 1

0

快速测试表明,只需调用 .Text() 就足够了,请参见下面的代码:

package main

import (
 "fmt"
 "os"
 "strings"

 "github.com/PuerkitoBio/goquery"
)

func main() {

 htmlString := `<!DOCTYPE html>
 <html lang="en">
 <head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
 </head>
 <body>
  <h1>AWESOME HEADER</h1>
  <script type="myjson">
   [{"class": "companyClass", "location": "companyLocation"}]
  </script>
 
 </body>
 </html>`

 doc, err := goquery.NewDocumentFromReader(strings.NewReader(htmlString))
 if err != nil {
  panic(err)
 }

 doc.Find("script").Each(func(i int, element *goquery.Selection) {
  _, exists := element.Attr("type")
  if exists {
   file, err := os.Create("result.txt")
   if err != nil {
    panic(err)
   }
   defer file.Close()

   stringToWrite := strings.TrimSpace(element.Text())
   fmt.Println(stringToWrite)
   file.WriteString(stringToWrite)
  }
 })

}

生成的文件以及标准输出包含:

[{"class": "companyClass", "location": "companyLocation"}]

请提供您正在使用的 html(或其与问题相关的部分)。

于 2021-10-10T18:59:14.443 回答