英文:
net/html parses document, returns nil *html.Node no matter what
问题
我正在尝试处理一个HTML文档。问题是golang.org/x/net/html
的Parse
函数返回一个值为nil
的*html.Node
,而且err
也是nil
,这有点奇怪,因为如果Parse
函数没有正确处理,我应该会得到一个错误!
这是我的代码:
package main
import (
"bytes"
"golang.org/x/net/html"
"io/ioutil"
"log"
)
func main() {
html, err := ioutil.ReadFile("html/simple_01.html")
if err != nil {
log.Fatal(err)
}
doc, err := html.Parse(bytes.NewReader(html))
if err != nil {
log.Fatal(err)
}
// locate <body>
var body *html.Node
for s := doc.NextSibling; s != nil; s = s.NextSibling {
if s.Data == "body" {
body = s
break
}
}
log.Println(body)
}
log.Println(body)
打印出nil
。同时打印doc
也是nil
,这很奇怪。
这是我正在测试的HTML文档:
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Sample page - 01</title>
</head>
<body>
<p>Aspernatur vel molestiae eius sed sunt doloremque. Ipsa sed voluptate expedita tempore id. Ab nobis delectus magnam.</p>
<p>Beatae id mollitia nesciunt nesciunt qui explicabo cum. Aspernatur est molestiae laudantium assumenda consequuntur. Odit mollitia non inventore iusto. Id nihil voluptatem vitae. Fugit odio dolores atque sed.</p>
<p>Qui dolorem ipsum fugit vitae consequuntur suscipit debitis iste. Dignissimos impedit nobis quas facilis. Quia dignissimos perspiciatis quia debitis. Rerum beatae repellat architecto nostrum nulla facere rerum.</p>
<p>Quas natus ad qui excepturi dolorem. Quas dolorum dolores voluptatem distinctio quisquam culpa et. Ipsam voluptatem suscipit earum reprehenderit. Quos laudantium occaecati quis similique. Numquam rerum sunt rerum et necessitatibus. Laboriosam modi iure praesentium voluptates atque adipisci et.</p>
<p>Blanditiis dolores nemo quos voluptatem quo quia modi. Quia et alias nesciunt sint voluptatum omnis. Nihil minima ipsa magnam qui amet ea. Blanditiis laborum nihil tempora aliquam.</p>
<p>Ullam molestiae omnis magni ratione exercitationem minima. Sed sequi fugiat laborum omnis voluptas. Debitis sit expedita optio et at qui.</p>
<p>Fuga iusto quo eum sequi eum sint pariatur ipsam. Alias nisi maiores illum est ab culpa voluptas quidem. Veritatis eum qui deserunt aspernatur quo officia et ipsam.</p>
<p>Aliquam id autem earum autem eaque. Dolores veniam animi voluptatem. Et est nam culpa consequatur et ex distinctio. Quis iure sequi maiores quibusdam vel nostrum architecto et. Quisquam unde qui pariatur doloremque rerum.</p>
<p>Dicta est est fugit et architecto. Quia culpa vel error deleniti. Voluptatem fuga omnis eius ea et voluptatum dolor.</p>
<p>Eaque esse sint voluptatem praesentium ut sit. Fugiat ratione enim doloremque dolor asperiores. Tempora eveniet et aut.</p>
</body>
</html>
我做错了什么?
英文:
I'm trying to process an html document. Thing is that golang.org/x/net/html
's Parse
returns a *html.Node
with nil
value, err
is also nil, which is kind of strange because if things aren't processed by Parse
correctly, I should get an error!
This is my code:
package main
import (
"bytes"
"golang.org/x/net/html"
"io/ioutil"
"log"
)
func main() {
html, err := ioutil.ReadFile("html/simple_01.html")
if e != nil {
fmt.Fatal(e)
}
doc, err := html.Parse(bytes.NewReader(html))
if err != nil {
log.Fatal(err)
}
// locate <body>
var body *html.Node
for s := doc.NextSibling; s != nil; s = s.NextSibling {
if s.Data == "body" {
body = s
break
}
}
log.Println(body)
}
log.Println(body)
prints nil
. Also printing doc
prints nil
, which is weird.
Here is the HTML document I'm testing against
<!DOCTYPE html>
<html>
<head>
<meta charset='utf-8'>
<title>Sample page - 01</title>
</head>
<body>
<p>Aspernatur vel molestiae eius sed sunt doloremque. Ipsa sed voluptate expedita tempore id. Ab nobis delectus magnam.</p>
<p>Beatae id mollitia nesciunt nesciunt qui explicabo cum. Aspernatur est molestiae laudantium assumenda consequuntur. Odit mollitia non inventore iusto. Id nihil voluptatem vitae. Fugit odio dolores atque sed.</p>
<p>Qui dolorem ipsum fugit vitae consequuntur suscipit debitis iste. Dignissimos impedit nobis quas facilis. Quia dignissimos perspiciatis quia debitis. Rerum beatae repellat architecto nostrum nulla facere rerum.</p>
<p>Quas natus ad qui excepturi dolorem. Quas dolorum dolores voluptatem distinctio quisquam culpa et. Ipsam voluptatem suscipit earum reprehenderit. Quos laudantium occaecati quis similique. Numquam rerum sunt rerum et necessitatibus. Laboriosam modi iure praesentium voluptates atque adipisci et.</p>
<p>Blanditiis dolores nemo quos voluptatem quo quia modi. Quia et alias nesciunt sint voluptatum omnis. Nihil minima ipsa magnam qui amet ea. Blanditiis laborum nihil tempora aliquam.</p>
<p>Ullam molestiae omnis magni ratione exercitationem minima. Sed sequi fugiat laborum omnis voluptas. Debitis sit expedita optio et at qui.</p>
<p>Fuga iusto quo eum sequi eum sint pariatur ipsam. Alias nisi maiores illum est ab culpa voluptas quidem. Veritatis eum qui deserunt aspernatur quo officia et ipsam.</p>
<p>Aliquam id autem earum autem eaque. Dolores veniam animi voluptatem. Et est nam culpa consequatur et ex distinctio. Quis iure sequi maiores quibusdam vel nostrum architecto et. Quisquam unde qui pariatur doloremque rerum.</p>
<p>Dicta est est fugit et architecto. Quia culpa vel error deleniti. Voluptatem fuga omnis eius ea et voluptatum dolor.</p>
<p>Eaque esse sint voluptatem praesentium ut sit. Fugiat ratione enim doloremque dolor asperiores. Tempora eveniet et aut.</p>
</body>
</html>
What am I doing wrong?
答案1
得分: 2
你的代码示例中有几处拼写错误,但主要问题是你试图获取根节点的下一个兄弟节点。你首先需要获取到html标签,然后再向下遍历其第一个子节点的兄弟节点:
package main
import (
"bytes"
"golang.org/x/net/html"
"io/ioutil"
"log"
)
func main() {
htmlfile, err := ioutil.ReadFile("html/simple_01.html")
if err != nil {
log.Fatal(err)
}
doc, err := html.Parse(bytes.NewReader(htmlfile))
if err != nil {
log.Fatal(err)
}
var htmlTag = doc.FirstChild.NextSibling
var body *html.Node
for s := htmlTag.FirstChild; s != nil; s = s.NextSibling {
if s.Data == "body" {
body = s
break
}
}
log.Println(body)
}
希望对你有帮助!
英文:
There are several typos in your code example, but the main problem is, that you are trying to get the next sibling of the root node. You first need to get to the html tag and from there you go down to the first child and then loop through its siblings:
package main
import (
"bytes"
"golang.org/x/net/html"
"io/ioutil"
"log"
)
func main() {
htmlfile, err := ioutil.ReadFile("html/simple_01.html")
if err != nil {
log.Fatal(err)
}
doc, err := html.Parse(bytes.NewReader(htmlfile))
if err != nil {
log.Fatal(err)
}
var htmlTag = doc.FirstChild.NextSibling
var body *html.Node
for s := htmlTag.FirstChild; s != nil; s = s.NextSibling {
if s.Data == "body" {
body = s
break
}
}
log.Println(body)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论