如何在Golang中仅从HTML中提取文本?
为了从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
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?