使用GoQuery在换行符上拆分元素
我正在尝试使用GoQuery从页面获取内容,但由于某些原因,我无法执行联机拆分(br) HTML,如下所示:使用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 />
<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()
有多个返回参数吧?顺便问一句,你们对我同时找到的解决方案有什么看法?