Search code examples
htmlgogoquery

Search tags by id with goQuery


I would like to retrieve all the tags with a specific id using Go. Apparently the easiest way to do that is go is to use goquery.

Assume I am looking for ul tags with id MyTag in a website site. I would like to list all the li contained in such a ul. I never used jQuery before so I feel a little lost.

resp, _ := http.Get(site)
httpBody := resp.Body
node, _ := html.Parse(httpBody)
document := goquery.NewDocumentFromNode(node)
document.Find("ul.MyTag").Each(func(i int, ul *goquery.Selection) { //MyTag will not work here
    ul.Find("li").Each(func (i int, li *goquery.Selection){
        ...
   })
})

More specitically, my html looks like

<html>
    <body>
        <ui id="yes">
            <li key="1">a</li>
            <li key="2">b</li>
            <li key="3">c</li>
            <li key="4">d</li>
        </ui>

        <ui id="no">
            <li key="1">11</li>
            <li key="2">22</li>
            <li key="3">33</li>
            <li key="4">44</li>
        </ui>
    </body>
</html>

and I would like to retreive the keys 1,2,3,4

Bonus question: why Each has an int argument? It doesn't seem to be used at all


Solution

  • GoQuery uses the same selector syntax as jQuery/CSS. To that end, if you want to find an element with a specific ID .. then you need to use a hash # symbol.

    document.Find("ul#MyTag")...
    

    That being said, ID's are supposed to be unique. The above code you're using (that I provided in a previous question of yours) .. searches by class (the dot . notation).

    Show us the markup you're using this on and I will be able to see exactly where you're going wrong.

    RE: Your bonus question. The int argument is the index of the element within its parent. You don't have to use it.. it is provided by goquery though.