我正在尝试使用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>Go代码:
doc, err := goquery.NewDocumentFromReader(res.Body)
if err != nil {
panic(err)
}
doc.Find("ul").Each(func(i int, s *goquery.Selection) {
str := s.Find("li p").Next().Text()
fmt.Println(str, "--")
})由于某些原因,我无法得到每一行,用p标记中的分隔符分隔,因为上面代码的单个item.Output是:
Line1Line2Line3Line4LineN--但是我想要实现的输出应该如下所示:
Line1--
Line2--
Line3--
Line4--
LineN--既然我是新手,如果有什么不清楚的地方请告诉我,所以我会尽可能多地解释。
谢谢。
发布于 2018-05-08 19:40:36
.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()), "--")
}
})
})
}生产:
Line 1 --
Line 2 --
Line 3 --
Line 4 --
Line N --发布于 2018-05-08 19:06:39
我运行了您显示的代码,并且在字符串中得到了换行符。假设您使用的是goquery的最新版本,除非html不是
<p>
Line 1<br />
Line 2<br />
Line 3<br />
Line 4<br />
Line N
</p>但实际上是这样的:
<p>
Line 1<br />Line 2<br />Line 3<br />Line 4<br />Line N
</p>(请记住,例如,当您打开chrome工具时,它可能会将其显示为前者,即使实际的源代码是后者)
在这种情况下,这是预期的行为:
let html_1 = $(`<p>
Line 1<br />
Line 2<br />
Line 3<br />
Line 4<br />
Line N
</p>`);
let html_2 = $(`<p>
Line 1<br />Line 2<br />Line 3<br />Line 4<br />Line N
</p>`);
console.log({html1: html_1.text(), html2: html_2.text()});<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
要解决这个问题,您可能只需这样做:
p := s.Find("li p").Next()
p.SetHtml(strings.Replace(p.Html(), "<br />", "<br />\n", -1)).Text()尽管如此,您可能不得不使用<br/>、<br />或<br>,因为我不确定它将如何呈现它。
发布于 2018-05-08 19:05:30
好的,我找到了一个solution.Not,确定它是否正确,所以如果有人有更好的东西-请分享它。
因此,基本上,我将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, "--")
}https://stackoverflow.com/questions/50239543
复制相似问题