使用Nokogiri进行Web搜索 - 一个具体的例子

时间:2018-04-06 14:40:45

标签: ruby-on-rails nokogiri

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

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

2 个答案:

答案 0 :(得分:3)

在这里,我先使用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驱动程序并使用不同的策略来解决这个问题。

enter image description here

答案 1 :(得分:1)

问题是网站使用的是角度,所以它的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>

就像那样,您无法从这些库中获取值。您将不得不使用一个模拟Web浏览器的内容,因此它实际上是从角度渲染内容,您可以从这些变量中获取实际值。反正它不是很简单。祝你好运!