使用Go解析html中的列表项
我想用Go提取所有列表项(每个使用Go解析html中的列表项,go,Go,我想用Go提取所有列表项(每个)的内容。我应该使用regexp来获取项,还是有其他库用于此目的 我的意图是在Go中获取一个列表或数组,其中包含来自特定html网页的所有列表项。我应该怎么做?您可能想使用。 它不在Go标准包中,而是在。(子存储库是Go项目的一部分,但在主Go树之外。它们是在比Go核心更宽松的兼容性要求下开发的。) 该文档中的内容可能与您想要的内容类似 如果出于某种原因您需要坚持使用Go标准包,那么 对于“典型HTML”,您可以使用 两个软件包都倾向于使用io.Reader进行输入
)的内容。我应该使用regexp来获取
项,还是有其他库用于此目的
我的意图是在Go中获取一个列表或数组,其中包含来自特定html网页的所有列表项。我应该怎么做?您可能想使用。 它不在Go标准包中,而是在。(子存储库是Go项目的一部分,但在主Go树之外。它们是在比Go核心更宽松的兼容性要求下开发的。) 该文档中的内容可能与您想要的内容类似 如果出于某种原因您需要坚持使用Go标准包,那么 对于“典型HTML”,您可以使用 两个软件包都倾向于使用
io.Reader
进行输入。如果您有字符串
或[]字节
变量,则可以使用字符串.NewReader
或字节.Buffer
将它们包装起来,以获得io.Reader
对于HTML,您更可能来自http.Response
body
(确保完成后将其关闭)。
也许是这样的:
resp, err := http.Get(someURL)
if err != nil {
return err
}
defer resp.Body.Close()
doc, err := html.parse(resp.Body)
if err != nil {
return err
}
// Recursively visit nodes in the parse tree
var f func(*html.Node)
f = func(n *html.Node) {
if n.Type == html.ElementNode && n.Data == "a" {
for _, a := range n.Attr {
if a.Key == "href" {
fmt.Println(a.Val)
break
}
}
}
for c := n.FirstChild; c != nil; c = c.NextSibling {
f(c)
}
}
f(doc)
}
当然,对于在客户端使用JavaScript修改自己内容的页面,解析获取的网页是不起作用的。我找到了一种解决方法 如果您试图提取
li
元素后的文本,您首先找到li
元素,然后将标记器移动到下一个元素,该元素将是文本(希望如此)。如果下一个元素是锚点、跨度等,则可能需要使用一些逻辑
resp, err := http.Get(url)
if err!=nil{
log.Fatal(err)
}
defer resp.Body.Close()
z := html.NewTokenizer(bufio.NewReader(resp.Body))
for {
tt := z.Next()
switch tt {
case html.ErrorToken:
return
case html.StartTagToken:
t := z.Token()
swith t.Data {
case "li":
z.Next()
t = z.Token()
fmt.Println(t.Data)
}
}
}
但实际上,你应该只使用github.com/purkitobio/goquery也许这个功能很有用?你想浏览整个网站吗?不要尝试。一般来说,在使用regexp处理任何事情之前,都要三思而后行,它有它的位置,但是太多的人在他们做的每一件事上都会使用它。@DaveC这正是我开始这个问题的原因,以找出是否还有其他更合适的方法。我不理解所有的反对票……注意,我没有把
golang.org/x/net/html
包作为Go项目html解析器,所以这个答案的前一个版本只提到了Go标准encoding/xml
包(在过去,当我想要/需要坚持使用标准包时,我会使用它进行简单的HTML解码)。