Goquery 和 Gokogiri 解析问题

https://github.com/PuerkitoBio/goquery 解析HTML,
想得到 “abc”这个值

<meta name="format-detection" content="telephone=no, address=no">
<meta name="description" content="abc”/>

参考了文章 http://1.guotie.sinaapp.com/?p=501 ,Find(“meta[name]”)后,只能得到第一meta name的值”telephone=no, address=no”,加个.Next()也不行。

    dhead := doc.Find("head")
    dcharset := dhead.Find("meta[name]")
    charset, _ := dcharset.Attr("content")

求指点,谢谢!

共 9 个回复


sdrzlyz

恰巧用过这个库。。。

dhead.Find("meta[name]").Each(func(xxx,xxx){

})

因为存在多个元素,需要用each依次取出

或者先 dhead.Find("meta[name]").Sizes() 得到个数.
然后使用Eq(i)配合循环来完成

# 0

yue

谢谢@sdrzlyz 这么快解答!

我用each依次取出,但是好像只能按照顺序卡位Eq(i)获得值,并不能按照 name=”description” 获得值:(
比如,我要解析个任意淘宝地址 https://item.taobao.com/item.htm?id=520553762082
它的meta name 有好多,如果不能直接指定name取出来,害怕html一但有变化,程序就会卡错位了~

<meta name="format-detection" content="telephone=no, address=no">
<meta name="renderer" content="webkit">
<meta name="description" content="欢迎前来淘宝网实力旺铺..."/>
<meta name="keywords" content="淘宝,掏宝,网上购物,店铺.."/>
<meta name="data-spm" content="2013" />
 <meta name="microscope-data" content="pageId=1081496171;prototypeId=2;siteId=4; shopId=59298518; userid=285607071;">

我的测试代码:

        var metaName string

        doc.Find("head").Find("meta[name]").Each(func(i int, s *goquery.Selection) {
            temp, exists := s.Attr("content")
            if !exists {
                return
            }
            metaName, err = iconv.ConvertString(temp, "GB2312", "utf-8")
            revel.INFO.Println(metaName)
        })

嗯,估计一般网站上的meta也不能总变,再次感谢楼上~还学会了size()

# 1

David

@yue 你可以用s.Attr("name")判断一下是"description"了以后再取出来,这样就不依赖于顺序了。

# 2

yue

@David 哇,果然呀,谢谢大神指点迷津~嗯,我是小白依葫芦画瓢啊,这次明白了~谢谢!

# 3

qq277049

不用这么复杂,直接使用Eq()方法就可以

dcharset.Eq(1).Attr("content")

也可以这样用

dhead.Find("meta[name=description]")
# 4

yue

@qq277049 谢谢,原来可以这样直接查,学习了~
再继续请教,查找<script>中内容,比如上面的例子:

<script>
 function now(){ return +new Date}
 g_config = {
 startTime: now,
 online:  true ,
 prefetch:[],
 beacon:{},   timing:[],   clock:[],   t:"20131018",  ver:"6.2.0",   st:"201404041900",
 shopVer:2,
 appId: 1 ,
 itemId:"520553762082",
 shopId:"59298518",
 pageId:"520553762082",
 assetsHost:"//assets.alicdn.com",
 sellerNick:"迎宾尚购",
...
</script>

我用doc.Find(“script”).Eq(0) 定位后,想继续解析出 pageId 的值 52055376208,怎么试都试不出来了,是不是这里只能用正则操作字符串提出来呢?

谢谢,菜鸟问题比较多啊!

# 5

fsyx

不错,有学习了

# 6

yue

oh,楼上又把这贴顶起来了~

那再来请教,哪位前辈用过 github.com/moovweb/gokogiri 呢?

因为我在用 goquery时,解析某些网页时碰到了 “ stopped after 10 redirects“ 错误

所以学习使用 googiri ,但这个介绍文档好少呀,只有这篇 《gokogiri 的使用小试》 ,想求些更精准解析的例子,比如解析html:

<title> hello world </title>
...
<p>
test
</p>
<img  id="bigImage" alt="" src="http://abc.com/123.jpg">
...

我用 nodetile, err := doc.Search("//title") 解析得到的是<title> hello world </title> 而不是 hello world ;

或者,nodeimage, err := doc.Search("//img[@id='bigImage']") 解析得到的是 <img id="bigImage" alt="" src="http://abc.com/123.jpg">, 而不是我想要的http://abc.com/123.jpg

请熟悉gokogiri 的前辈指点迷津,感觉不应该再去用正则提取字符串那么麻烦,谢谢!

# 7

yue

哦,是这样的:

nodetitle, err := doc.Search("//title")
title :=nodetitle[0].Content()

nodeimage, err := doc.Search("//img[@id='bigImage']")
shopimage = nodeimage[0].Attr("src")
# 8