【问题标题】:How to retrieve search list using goquery from RottenTomatoes?如何使用 Rotten Tomatoes 中的 jquery 检索搜索列表?
【发布时间】:2019-05-13 18:20:50
【问题描述】:

我目前正在尝试从 RottenTomatoes 获取搜索列表以进行一些研究。我已经为不同的站点以一种简单的方式集成了goquery。但烂番茄的情况就不一样了。即使我尝试了不同的查询方式,我也无法获得搜索列表。

测试网址:https://www.rottentomatoes.com/search/?search=test

我想得到的文本Testament

doc.Text() 输出: https://pastebin.com/SsWHYXTH

这是我的工作:

func ParseSearchMovies(doc *goquery.Document) *models.SearchResponse {
    result := new(models.SearchResponse)
    finder0 := doc.Find("section > section > ul")
    finder1 := doc.Find("section.movieSection > ul")
    finder2 := doc.Find("section.movieSection > ul > li")
    finder3 := doc.Find("movieSection")
    finder4 := doc.Find("section.movieSection")
    finder5 := doc.Find("section.movieSection ul.results_ul")
    finder6 := doc.Find("div.Search.Results li.bottom_divider.clearfix")
    finder7 := doc.Find("div.search-results-root span.bold")
    finder8 := doc.Find("div.search-results-root #details")
    finder9 := doc.Find("div.search-results-root li.bottom_divider.clearfix")
    finder10 := doc.Find("#movieSection > ul > li:nth-child(1)")
    finder11 := doc.Find("#movieSection > ul")
    finder12 := doc.Find("#movieSection > ul .bottom_divider.clearfix")
    finder13 := doc.Find("#movieSection > ul > li")
    finder14 := doc.Find("section.Search.Results .movieSection")
    finder15 := doc.Find("#search-results-root section")
    finder16 := doc.Find("#search-results-root .section")
    finder17 := doc.Find("#search-results-root .section .section")
    finder18 := doc.Find("#search-results-root > section > section")
    finder19 := doc.Find("#search-results-root > section .section")

    //From hlscalon's answer
    finder20 := doc.Find("#movieSection > .results_ul > li > div.details")
    finder21 := doc.Find("#movieSection > .results_ul > li")
    finder22 := doc.Find("#movieSection > .results_ul")
    finder23 := doc.Find("#movieSection")

    fmt.Printf("%d", len(finder0.Nodes))
    fmt.Printf("%d", len(finder1.Nodes))
    fmt.Printf("%d", len(finder2.Nodes))
    fmt.Printf("%d", len(finder3.Nodes))
    fmt.Printf("%d", len(finder4.Nodes))
    fmt.Printf("%d", len(finder5.Nodes))
    fmt.Printf("%d", len(finder6.Nodes))
    fmt.Printf("%d", len(finder7.Nodes))
    fmt.Printf("%d", len(finder8.Nodes))
    fmt.Printf("%d", len(finder9.Nodes))
    fmt.Printf("%d", len(finder10.Nodes))
    fmt.Printf("%d", len(finder11.Nodes))
    fmt.Printf("%d", len(finder12.Nodes))
    fmt.Printf("%d", len(finder13.Nodes))
    fmt.Printf("%d", len(finder14.Nodes))
    fmt.Printf("%d", len(finder15.Nodes))
    fmt.Printf("%d", len(finder16.Nodes))
    fmt.Printf("%d", len(finder17.Nodes))
    fmt.Printf("%d", len(finder18.Nodes))
    fmt.Printf("%d", len(finder19.Nodes))
    fmt.Printf("%d", len(finder20.Nodes))
    fmt.Printf("%d", len(finder21.Nodes))
    fmt.Printf("%d", len(finder22.Nodes))
    fmt.Printf("%d", len(finder23.Nodes))
}
  • Expected: 9(<section id="movieSection"> 中的电影计数)

  • Actual:所有结果都返回0。输出:000000000000000000000000

P.S:当我通过doc.Text() 将结果打印到控制台时,整个页面都会正确显示。

按顺序打印所有电影名称:

if len(myFinder.Nodes) > 0 {
    doc.Find("MY QUERY").Each(func(i int, s *goquery.Selection) {
        name := s.Find("a")

        fmt.Println(name)
    })
}

【问题讨论】:

    标签: html go web-scraping extract goquery


    【解决方案1】:

    有一些(很多)替代方案,但如果您想要所有电影链接的列表,这应该可行:

    #movieSection > .results_ul > li > div.details > span.bold > a.articleLink
    

    这将引导您直接访问链接 (a),因此您可能需要更改函数以打印名称或停止前一步 (span)

    编辑

    实际上,我认为不能使用 goquery 来抓取该页面。它使用react,所以当你下载页面(即curl "https://www.rottentomatoes.com/search/?search=test")时,你会看到:

    <div id="main_container" class="container ">
        <div class="col col-left-center col-full-xs">
            <div id="search-results-root"></div>
                <script>
                    require(['jquery', 'globals', 'search-results', 'bootstrap'], function($, RT, mount) {
                    mount($("#search-results-root").get(0), RT.PrivateApiV2FrontendHost, 'test', {"actorCount"....
    

    当 goquery 只需要 html 时

    【讨论】:

    • 我不工作。返回 0 节点。我创建了一个循环并检查了它,但它总是变成 0。
    • 嗯,我怎样才能得到电影列表?我应该将search-results-root 解析为 JSON 格式吗?
    • 你肯定有电影,但我认为你不能用 goquery 解析它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2012-06-25
    • 1970-01-01
    • 2017-11-23
    • 2020-11-17
    • 2010-11-28
    相关资源
    最近更新 更多