Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Golang中仅从HTML中提取文本?_Html_Go_Text - Fatal编程技术网

如何在Golang中仅从HTML中提取文本?

如何在Golang中仅从HTML中提取文本?,html,go,text,Html,Go,Text,为了从HTML中提取文本,我使用了 s := ` <p>Links:</p><ul><li><a href="foo">Foo</a><li> <a href="/bar/baz">BarBaz</a></ul><span>TEXT <b>I</b> WANT</span> <script type='text/ja

为了从HTML中提取文本,我使用了

    s := `
<p>Links:</p><ul><li><a href="foo">Foo</a><li>
<a href="/bar/baz">BarBaz</a></ul><span>TEXT <b>I</b> WANT</span>
<script type='text/javascript'>
/* <![CDATA[ */
var post_notif_widget_ajax_obj = {"ajax_url":"http:\/\/site.com\/wp-admin\/admin-ajax.php","nonce":"9b8270e2ef","processing_msg":"Processing..."};
/* ]]> */
</script>`

    domDocTest := html.NewTokenizer(strings.NewReader(s))
    for tokenType := domDocTest.Next(); tokenType != html.ErrorToken; {
        if tokenType != html.TextToken {
            tokenType = domDocTest.Next()
            continue
        }
        TxtContent := strings.TrimSpace(html.UnescapeString(string(domDocTest.Text())))
        if len(TxtContent) > 0 {
            fmt.Printf("%s\n", TxtContent)
        }
        tokenType = domDocTest.Next()
    }
s:=`
链接:

我想要的文本 /* */ ` domDocTest:=html.NewTokenizer(strings.NewReader) 对于令牌类型:=domDocTest.Next();令牌类型!=html.ErrorToken;{ 如果tokenType!=html.TextToken{ tokenType=domDocTest.Next() 持续 } TxtContent:=strings.TrimSpace(html.UnescapeString(string(domDocTest.Text())) 如果len(TxtContent)>0{ fmt.Printf(“%s\n”,TxtContent) } tokenType=domDocTest.Next() }
但我得到了这个结果

Links:
Foo
BarBaz
TEXT
I
WANT
/* <![CDATA[ */
var post_notif_widget_ajax_obj = {"ajax_url":"http:\/\/site.com\/wp-admin\/admin-ajax.php","nonce":"9b8270e2ef","processing_msg":"Processing..."};
/* ]]> */
链接:
福
巴尔巴兹
正文
我
希望
/*  */
我不想要
CDATA
内容。一些想法,如何只获取文本内容?

如果你使用它,很容易实现你想要的

  • 首先需要使用来标识要删除的元素,在您的示例中是
    scripts
    ,因此
    document.Find(scripts)

  • 然后,需要使用将其从文档中删除

  • 最后,您可以使用

所以,最终的代码是

package main

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

func main(){
  s := `<p>Links:</p><ul><li><a href="foo">Foo</a><li><a href="/bar/baz">BarBaz</a></ul><span>TEXT <b>I</b> WANT</span><script type='text/javascript'>/* <![CDATA[ */var post_notif_widget_ajax_obj = {"ajax_url":"http:\/\/site.com\/wp-admin\/admin-ajax.php","nonce":"9b8270e2ef","processing_msg":"Processing..."};/* ]]> */</script>`

  p := strings.NewReader(s)
  doc, _ := goquery.NewDocumentFromReader(p)

  doc.Find("script").Each(func(i int, el *goquery.Selection) {
      el.Remove()
  })

  fmt.Println(doc.Text()) // Links:FooBarBazTEXT I WANT

}
主程序包
进口(
“fmt”
“字符串”
“github.com/purkitobio/goquery”
)
func main(){
链接:

    • 我想要的文本/**/` p:=strings.NewReader doc,:=goquery.NewDocumentFromReader(p) 文档查找(“脚本”).Each(func(i int,el*goquery.Selection){ el.删除() }) fmt.Println(doc.Text())//链接:FooBarBazTEXT我想要 }
正如@Eric Pauley所指出的,我查看了
TextTokens
StartTagTokens
。 这是我的解决办法

s:=`
链接:

我想要的文本 /* */ ` domDocTest:=html.NewTokenizer(strings.NewReader) previousStartTokenTest:=domDoctTest.Token() 循环测试: 为了{ tt:=domDocTest.Next() 开关{ 案例tt==html.ErrorToken: break loopDomTest//文档结束,完成 案例tt==html.StartTagToken: previousStartTokenTest=domDocTest.Token() 案例tt==html.TextToken: 如果previousStartTokenTest.Data==“脚本”{ 持续 } TxtContent:=strings.TrimSpace(html.UnescapeString(string(domDocTest.Text())) 如果len(TxtContent)>0{ fmt.Printf(“%s\n”,TxtContent) } } }
实际上,您希望在这里忽略未渲染元素中的任何内容,即
脚本
标记。要做到这一点,您不仅需要查看
TextToken
s,还需要查看
StartTagToken
s。如果标记是脚本标记的开始,那么忽略下面的文本标记。如何删除CSS?以前的评论,但我想我会加入答案,因为我也必须解决它。要过滤掉CSS,您需要将
if previousStartTokenTest.Data==“script”
行修改为
if previousStartTokenTest.Data==“script”| | previousStartTokenTest.Data==“style”
。所有
元素都将被忽略。如何删除CSS?