gpt4 book ai didi

go - Html 解析器忽略 img 标签(Golang)

转载 作者:IT王子 更新时间:2023-10-29 01:42:05 30 4
gpt4 key购买 nike

我的任务是在 html 中查找图片 url

问题

Html 解析器 golang.org/x/net/html 以及github.com/PuerkitoBio/goquery 忽略页面上最大的图像 http://www.ozon.ru/context/detail/id/34498204/

问题

  • 我的代码有什么问题
  • 为什么需要 src=""img 标签被忽略?
  • 有没有办法用 go 从 html 中获取所有图像?

注意事项:

  • 当我使用 parser written in Swift 时此图片已在页面 //static2.ozone.ru/multimedia/spare_covers/1013531536.jpg

  • 上找到
  • 当我使用正则表达式搜索时,已经找到了这个图像标签。

  • 使用第三方服务时发现此图片标签saveallimages.com

  • 我尝试使用 gokogiri,但无法在我的 mac 上编译它。 Go get 成功了,但是 Go build 永远卡住了。

已解析的 html 页面源代码

This is the html这是 resp, _ := http.Get(url)

的结果

代码:

package main

import (
"golang.org/x/net/html"
"log"
"net/http"
)


func main() {

url := "http://www.ozon.ru/context/detail/id/34498204/"

if resp, err := http.Get(url); err == nil {
defer resp.Body.Close()

log.Println("Load page complete")

if resp != nil {
log.Println("Page response is NOT nil")

if document, err := html.Parse(resp.Body); err == nil {

var parser func(*html.Node)
parser = func(n *html.Node) {
if n.Type == html.ElementNode && n.Data == "img" {

var imgSrcUrl, imgDataOriginal string

for _, element := range n.Attr {
if element.Key == "src" {
imgSrcUrl = element.Val
}
if element.Key == "data-original" {
imgDataOriginal = element.Val
}
}

log.Println(imgSrcUrl, imgDataOriginal)
}

for c := n.FirstChild; c != nil; c = c.NextSibling {
parser(c)
}

}
parser(document)
} else {
log.Panicln("Parse html error", err)
}

} else {
log.Println("Page response IS nil")
}
}

}

最佳答案

这不是错误,而是 x/net/html 的预期行为这会影响所有基于 x/net/html 的解析器.

有四种可能的解决方案:

  1. 删除 <noscript></noscript>在 HTML 中所以 x/net/html将按预期解析其内容。像这样的东西:

    package main

    import (
    "golang.org/x/net/html"
    "log"
    "net/http"
    "io/ioutil"
    "strings"
    )

    func main() {

    url := "http://www.ozon.ru/context/detail/id/34498204/"

    if resp, err := http.Get(url); err == nil {
    defer resp.Body.Close()

    log.Println("Load page complete")

    if resp != nil {
    log.Println("Page response is NOT nil")
    // --------------
    data, _ := ioutil.ReadAll(resp.Body)
    resp.Body.Close()

    hdata := strings.Replace(string(data), "<noscript>", "", -1)
    hdata = strings.Replace(hdata, "</noscript>", "", -1)
    // --------------

    if document, err := html.Parse(strings.NewReader(hdata)); err == nil {
    var parser func(*html.Node)
    parser = func(n *html.Node) {
    if n.Type == html.ElementNode && n.Data == "img" {

    var imgSrcUrl, imgDataOriginal string

    for _, element := range n.Attr {
    if element.Key == "src" {
    imgSrcUrl = element.Val
    }
    if element.Key == "data-original" {
    imgDataOriginal = element.Val
    }
    }

    log.Println(imgSrcUrl, imgDataOriginal)
    }

    for c := n.FirstChild; c != nil; c = c.NextSibling {
    parser(c)
    }

    }
    parser(document)
    } else {
    log.Panicln("Parse html error", err)
    }

    } else {
    log.Println("Page response IS nil")
    }
    }

    }
  2. 补丁 x/net/htmlhttps://github.com/bearburger/net/commit/42ac75393ced8c48137b574278522df1f3fa2cec

  3. 在 go 1.4 中使用 gokogiri(我很确定这是支持的最后一个版本)

  4. 等待关于 https://github.com/golang/go/issues/16318 的决定如果这是真正的错误,我会提出拉取请求。

关于go - Html 解析器忽略 img 标签(Golang),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38293657/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com