【问题标题】:Webscraping with Nokogiri - a specific example使用 Nokogiri 进行网页抓取 - 一个具体示例
【发布时间】:2018-04-06 23:06:24
【问题描述】:

寻求帮助以帮助我入门。我正在尝试从这个网站上抓取最新的游戏信息:

https://www.pinnacle.com/en/odds/match/soccer/england/england-premier-league

我真的在为使用 Nokogiri 提取代码的语法而苦苦挣扎。我见过并尝试过的所有示例都使用比这更简单的站点!

如果我有:

class BdcController < ApplicationController

def bdc
    require 'nokogiri'

    require 'openssl'

    doc = Nokogiri::XML.parse(open('https://www.pinnacle.com/en/odds/match/soccer/england/england-premier-league?sport=True', :ssl_verify_mode => OpenSSL::SSL::VERIFY_NONE))

    hometeam = doc.css('table.odds-data.game-name name').text #no idea what this line shoudl be to return e.g the first team in the list (currently Leicester City)

end

@grab=hometeam

end   

它目前返回 nil(这并不奇怪,因为我无法确定主队阵容应该是什么样子!)

谁能给我一个例子,说明主队的首发阵容应该读什么?提前致谢!

TD

【问题讨论】:

    标签: ruby-on-rails nokogiri


    【解决方案1】:

    给你,我先用HTTParty提取HTML,然后传给Nokogiri

    url = "https://www.pinnacle.com/en/odds/match/soccer/england/england-premier-league?sport=True"
    html = HTTParty.get(url, verify: false).body
    parser = Nokogiri::HTML(html, nil, Encoding::UTF_8.to_s)
    parser.css('table.odds-data>tbody>tr>td.game-name>span').text
    

    输出

    "{{participant.Name}}{{'Draw' | guestlinesDraw}}{{participant.Pitcher}}"
    

    顺便看一下源代码,里面没有你直接要找的东西。它是由 Javascript 插值的。

    如果你想抓取这样的文本,你应该使用 selenium web driver 并使用不同的策略来解决这个问题。

    【讨论】:

    • 感谢您的帮助 - 我认为您的最后一点是问题所在。我希望它在该示例中输出“莱斯特城”,但这不在 HTTPParty 抓取的源代码中。我会查找 selenium....
    【解决方案2】:

    问题是网站使用了angular,所以它的HTMLS响应是这样的:

     <td class="game-name name">
        <span ng-if="participant.Name != undefined">{{participant.Name}}</span>
        <span ng-if="participant.IsDraw == true">{{'Draw' | guestlinesDraw}}</span>
        <span ng-if="participant.IsDraw == false && !!participant.Pitcher" class="pitcher">{{participant.Pitcher}}</span>
    </td>
    

    就像您无法从这些库中检索到的值一样。您将不得不使用一些模拟网络浏览器的浏览器,因此它真正从角度呈现内容,您可以从这些变量中获得真正的价值。无论如何,这并不简单。祝你好运!

    【讨论】:

    • 谢谢 - 这就是我得出的结论,尽管我不明白是我不理解它还是网站的实际运作方式。将开始研究 Angular - 虽然它可能太难了!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 2015-06-26
    • 2017-02-25
    • 1970-01-01
    • 2012-01-14
    • 2020-11-07
    • 2018-02-06
    相关资源
    最近更新 更多