首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用GoQuery拆分元素行中断

用GoQuery拆分元素行中断
EN

Stack Overflow用户
提问于 2018-05-08 17:51:40
回答 4查看 1.5K关注 0票数 0

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

HTML,如下所示:

代码语言:javascript
复制
<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代码:

代码语言:javascript
复制
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是:

代码语言:javascript
复制
Line1Line2Line3Line4LineN--

但是我想要实现的输出应该如下所示:

代码语言:javascript
复制
Line1--
Line2--
Line3--
Line4--
LineN--

既然我是新手,如果有什么不清楚的地方请告诉我,所以我会尽可能多地解释。

谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-05-08 19:40:36

.Text()将:

Text获取匹配元素集中的每个元素的组合文本内容,包括它们的后代。

所以,您真正想做的是获取内容,并筛选出任何br标记。正如dave的答案所述,这里有新的行字符,因此我还对这些字符进行了修剪:

代码语言:javascript
复制
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()), "--")
            }

        })

    })
}

生产:

代码语言:javascript
复制
Line 1 --
Line 2 --
Line 3 --
Line 4 --
Line N --
票数 1
EN

Stack Overflow用户

发布于 2018-05-08 19:06:39

我运行了您显示的代码,并且在字符串中得到了换行符。假设您使用的是goquery的最新版本,除非html不是

代码语言:javascript
复制
<p>
    Line 1<br />
    Line 2<br />
    Line 3<br />
    Line 4<br />
    Line N
</p>

但实际上是这样的:

代码语言:javascript
复制
<p>
    Line 1<br />Line 2<br />Line 3<br />Line 4<br />Line N
</p>

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

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

代码语言:javascript
复制
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()});
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

要解决这个问题,您可能只需这样做:

代码语言:javascript
复制
p := s.Find("li p").Next()
p.SetHtml(strings.Replace(p.Html(), "<br />", "<br />\n", -1)).Text()

尽管如此,您可能不得不使用<br/><br /><br>,因为我不确定它将如何呈现它。

票数 1
EN

Stack Overflow用户

发布于 2018-05-08 19:05:30

好的,我找到了一个solution.Not,确定它是否正确,所以如果有人有更好的东西-请分享它。

因此,基本上,我将li p的值存储为HTML,然后使用strings.Split对每个br标记进行中断,因为strings.Split返回字符串的片段,所以我只是循环遍历它。

代码语言:javascript
复制
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, "--")
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50239543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档