使用GoQuery在换行符上拆分元素

使用GoQuery在换行符上拆分元素,go,goquery,Go,Goquery,我正在尝试使用GoQuery从页面获取内容,但由于某些原因,我无法执行联机拆分(br) HTML,如下所示: <ul> <li>I'm skipped</li> <li> Text Into - <p>Whatever</p> <p> Line 1<br /> Line 2<br />

我正在尝试使用GoQuery从页面获取内容,但由于某些原因,我无法执行联机拆分(br)

HTML,如下所示:

<ul>
    <li>I'm skipped</li>

    <li> 
        Text Into  - <p>Whatever</p>
        <p>
            Line 1<br />
            Line 2<br />
            Line 3<br />
            Line 4<br />
            Line N
        </p>
    </li> 
</ul>
Line1--
Line2--
Line3--
Line4--
LineN--
由于某些原因,我无法将每一行(由打断p标记分隔)作为单个项目。上述代码的输出为:

Line1Line2Line3Line4LineN--
但我试图实现的输出应该如下所示:

<ul>
    <li>I'm skipped</li>

    <li> 
        Text Into  - <p>Whatever</p>
        <p>
            Line 1<br />
            Line 2<br />
            Line 3<br />
            Line 4<br />
            Line N
        </p>
    </li> 
</ul>
Line1--
Line2--
Line3--
Line4--
LineN--
由于我是新手,如果有什么不清楚的地方,请在评论中告诉我,所以我会尽可能多地解释


谢谢。

好的,我找到了一个解决方案。不确定这是否正确,所以如果有人有更好的,请分享

基本上,我将
li p
的值存储为HTML,然后使用
strings.Split
在每个
br
标记上断开,因为
strings.Split
返回字符串的片段,我只是循环它

title, err := s.Find("li p").Next().Html()
if err != nil {
    panic(err)
}

splittedTitles := strings.Split(title, "<br/>")

for _, str := range splittedTitles {
    fmt.Println(str, "--")
}
title,err:=s.Find(“lip”).Next().Html()
如果出错!=零{
恐慌(错误)
}
拆分标题:=strings.Split(标题“
”) 对于u,str:=范围拆分标题{ 格式打印项次(str,“--”号) }
好的,我找到了一个解决方案。不确定这是否正确,所以如果有人有更好的,请分享

基本上,我将
li p
的值存储为HTML,然后使用
strings.Split
在每个
br
标记上断开,因为
strings.Split
返回字符串的片段,我只是循环它

title, err := s.Find("li p").Next().Html()
if err != nil {
    panic(err)
}

splittedTitles := strings.Split(title, "<br/>")

for _, str := range splittedTitles {
    fmt.Println(str, "--")
}
title,err:=s.Find(“lip”).Next().Html()
如果出错!=零{
恐慌(错误)
}
拆分标题:=strings.Split(标题“
”) 对于u,str:=范围拆分标题{ 格式打印项次(str,“--”号) }
我运行了您显示的代码,字符串中出现了换行符。假设您使用的是最新版本的goquery,那么您也应该使用,除非您的html不是

<p>
    Line 1<br />
    Line 2<br />
    Line 3<br />
    Line 4<br />
    Line N
</p>

第1行
第2行
第3行
第4行
第N行

但实际上是这样的:

<p>
    Line 1<br />Line 2<br />Line 3<br />Line 4<br />Line N
</p>

第1行
第2行
第3行
第4行
第N行

(请记住,例如,当您打开chrome开发工具时,它可能会显示为前者,即使实际来源是后者)

在这种情况下,这是预期的行为:

让html_1=$(`
第1行
第2行
第3行
第4行
第N行

`); 设html_2=$(` 第1行
第2行
第3行
第4行
第N行

`); log({html1:html_1.text(),html2:html_2.text()})
我运行了您显示的代码,字符串中出现了换行符。假设您使用的是最新版本的goquery,那么您也应该使用,除非您的html不是

<p>
    Line 1<br />
    Line 2<br />
    Line 3<br />
    Line 4<br />
    Line N
</p>

第1行
第2行
第3行
第4行
第N行

但实际上是这样的:

<p>
    Line 1<br />Line 2<br />Line 3<br />Line 4<br />Line N
</p>

第1行
第2行
第3行
第4行
第N行

(请记住,例如,当您打开chrome开发工具时,它可能会显示为前者,即使实际来源是后者)

在这种情况下,这是预期的行为:

让html_1=$(`
第1行
第2行
第3行
第4行
第N行

`); 设html_2=$(` 第1行
第2行
第3行
第4行
第N行

`); log({html1:html_1.text(),html2:html_2.text()})
.Text()
将:

Text获取集合中每个元素的组合文本内容 匹配的元素,包括其子元素

因此,您实际上要做的是获取内容并过滤掉任何br标记。正如dave的回答所述,其中有新行字符,因此我也对这些字符进行了删减:

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "strings"
)

var input string = `
<ul>
    <li>I'm skipped</li>

    <li> 
        Text Into  - <p>Whatever</p>
        <p>
            Line 1<br />
            Line 2<br />
            Line 3<br />
            Line 4<br />
            Line N
        </p>
    </li> 
</ul>
`

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

    doc.Find("ul").Each(func(i int, s *goquery.Selection) {

        p := s.Find("li p").Next()
        p.Contents().Each(func(i int, s *goquery.Selection) {
            if !s.Is("br") {
                fmt.Println(strings.TrimSpace(s.Text()), "--")
            }

        })

    })
}
.Text()
将:

Text获取集合中每个元素的组合文本内容 匹配的元素,包括其子元素

因此,您实际上要做的是获取内容并过滤掉任何br标记。正如dave的回答所述,其中有新行字符,因此我也对这些字符进行了删减:

package main

import (
    "fmt"
    "github.com/PuerkitoBio/goquery"
    "strings"
)

var input string = `
<ul>
    <li>I'm skipped</li>

    <li> 
        Text Into  - <p>Whatever</p>
        <p>
            Line 1<br />
            Line 2<br />
            Line 3<br />
            Line 4<br />
            Line N
        </p>
    </li> 
</ul>
`

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

    doc.Find("ul").Each(func(i int, s *goquery.Selection) {

        p := s.Find("li p").Next()
        p.Contents().Each(func(i int, s *goquery.Selection) {
            if !s.Is("br") {
                fmt.Println(strings.TrimSpace(s.Text()), "--")
            }

        })

    })
}

我认为如果在调用
.Text()
方法之前将

替换为“\n”或“---”,效果会更好

    // html is the result of `.Html()` method
    str := strings.Replace(html, "<br/>", "\\n", -1)
    doc, err := goquery.NewDocumentFromReader(strings.NewReader(str))
    if err != nil {
        return ""
    }
    return doc.Text()
//html是`.html()`方法的结果
str:=strings.Replace(html,“
,“\\n”,-1) doc,err:=goquery.NewDocumentFromReader(strings.NewReader(str)) 如果出错!=零{ 返回“” } 返回doc.Text()
我认为如果在调用
.Text()
方法之前将

替换为“\n”或“---”,效果会更好

    // html is the result of `.Html()` method
    str := strings.Replace(html, "<br/>", "\\n", -1)
    doc, err := goquery.NewDocumentFromReader(strings.NewReader(str))
    if err != nil {
        return ""
    }
    return doc.Text()
//html是`.html()`方法的结果
str:=strings.Replace(html,“
,“\\n”,-1) doc,err:=goquery.NewDocumentFromReader(strings.NewReader(str)) 如果出错!=零{ 返回“” } 返回doc.Text()
感谢Dave的回复,我尝试了您的解决方案,但在单值上下文中出现了错误
多值p.Html()
。我想可能是因为
p.Html()
有多个返回参数吧?顺便问一下,您对我同时在中找到的解决方案有何看法?感谢Dave的回复,我尝试了您的解决方案,但在单值上下文中出现了错误
多值p.Html()
。我想可能是因为
p.Html()
有多个返回参数吧?顺便问一句,你们对我同时找到的解决方案有什么看法?