Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 如何刮<;脚本>;带有Nokogiri和Mechanize的标签_Ruby_Web Scraping_Nokogiri_Mechanize - Fatal编程技术网

Ruby 如何刮<;脚本>;带有Nokogiri和Mechanize的标签

Ruby 如何刮<;脚本>;带有Nokogiri和Mechanize的标签,ruby,web-scraping,nokogiri,mechanize,Ruby,Web Scraping,Nokogiri,Mechanize,我正试图从“”中获取信息。我需要地址、电话号码和描述。所有这些信息都可以通过普通的HTML标记访问,这些标记可以使用Nokogiri进行刮取,但是我在标记中发现了一块信息 <script type="application/ld+json"> { "@context": "http://schema.org", "@type": "Lo

我正试图从“”中获取信息。我需要地址、电话号码和描述。所有这些信息都可以通过普通的HTML标记访问,这些标记可以使用Nokogiri进行刮取,但是我在
标记中发现了一块信息

<script type="application/ld+json">
          {
          "@context": "http://schema.org",
          "@type": "LocalBusiness",
          "address": {
          "@type":"PostalAddress",
          "streetAddress":"98-16 55th Avenue",
          "addressLocality":"Corona",
          "addressRegion":"NY",
          "postalCode": "11368"             
          },
          "name": "St. Paul The Apostle",
          "telephone":"(718) 271-1100",
          "image": "https://www.foodpantries.org/gallery/3101_st._paul_the_apostle_11368_idu.png",
          "description": "<b>Food Pantry Hours: </b><br>2nd and 4th week of the month <br>8:00am and open until food runs out <br>(usually people line up about 1 hour prior to 8 AM)<br><br><b>For more information, please call. </b><br>"
          }
        </script>

我如何才能做到这一点?

您想用JSON解析这些内容:

require 'json'
jsons = page.search('script[type="application/ld+json"]').map{|s| JSON.parse(s.content)}

如果您只是为了检索页面而使用Mechanize,那么Mechanize就太过了。有许多HTTP客户机gem可以轻松做到这一点,或者使用Ruby标准库的一部分

这是检索信息的基础。您需要找出您想要的特定脚本,但Nokogiri的脚本将为您提供基本内容:

require 'json'
require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open('https://www.foodpantries.org/li/st._paul_the_apostle_11368'))
此时,Nokogiri在内存中创建了一个页面的DOM

找到所需的
节点,并提取该节点的文本:

js = doc.at('script[type="application/ld+json"]').text
和是解析页面的工作区。有CSS和XPath特定的变体,但通常您可以使用通用版本,Nokogiri将确定使用哪一个。所有这些都记录在与
搜索以及教程相同的页面上

JSON是智能的,允许我们使用缩写来解析或生成JSON字符串。在本例中,它将字符串解析回Ruby对象,在本例中,Ruby对象是散列:

JSON[js]
# => {"@context"=>"https://schema.org",
#     "@type"=>"Organization",
#     "url"=>"https://www.foodpantries.org/",
#     "sameAs"=>[],
#     "contactPoint"=>
#      [{"@type"=>"ContactPoint",
#        "contactType"=>"customer service",
#        "url"=>"https://www.foodpantries.org/ar/about",
#        "email"=>"webmaster@foodpantries.org"}]}
访问特定的键/值对很简单,就像访问任何其他哈希一样:

foo = JSON[js]
foo['url'] # => "https://www.foodpantries.org/"

您所指的页面有多个脚本与我使用的选择器相匹配,因此您需要使用更精确的选择器进行筛选,或者迭代匹配项并选择所需的脚本。如何做到这一点在这里有很好的文档记录,因此使用CSS、XPath和Nokogiri的文档记录了这一点。

Mechanize是不必要的,如果这就是您想要做的。Nokogiri的教程包括检索页面,这就是您在示例中使用Mechanize的目的。
foo = JSON[js]
foo['url'] # => "https://www.foodpantries.org/"