如何使用Nokogiri和Mechanize刮除标签

问题描述 投票:0回答:2

我正在尝试从“ St. Paul The Apostle Details Page”中抓取信息。我需要地址,电话号码和说明。所有这些信息都可以通过可使用Nokogiri取消的常规HTML标签访问,但是我在<script>标签中找到了一块信息。

<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>

我希望使用这段代码来抓取我需要的所有信息:

def self.scrape_info
  agent = Mechanize.new
  page = agent.get('https://www.foodpantries.org/li/st._paul_the_apostle_11368')
  street_address = agent.page.search('script').text
  puts street_address.to_s
end

我该怎么做?

ruby web-scraping nokogiri mechanize
2个回答
0
投票

如果您仅使用机械化来检索页面,则机械化是多余的。有许多HTTP客户端gem可以轻松做到这一点,或使用Ruby标准库中的OpenURI

这是检索信息的基础。您需要确定所需的特定脚本,但Nokogiri的tutorials将为您提供基础知识:

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

doc = Nokogiri::HTML(open('https://www.foodpantries.org/li/st._paul_the_apostle_11368'))

此时,Nokogiri已在内存中创建了该页面的DOM。

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

js = doc.at('script[type="application/ld+json"]').text

atat是解析页面的主力军。有特定于CSS和XPath的变体,但是通常您可以使用通用版本,并且Nokogiri会找出要使用的版本。所有文档与searchsearch以及教程都记录在同一页面上。

JSON很聪明,允许我们使用at的简写形式来解析或生成JSON字符串。在这种情况下,它将字符串解析回Ruby对象,在这种情况下为哈希:

search

与其他任何哈希一样,访问特定的键/值对很简单:

JSON[...]

您所引用的页面具有多个脚本,这些脚本与我使用的选择器相匹配,因此您将要使用更精确的选择器进行过滤,或者遍历匹配项并选择所需的匹配器。使用CSS,XPath和Nokogiri的文档在SO上对此进行了很好的记录。


0
投票

您想使用JSON解析它们:

JSON[...]
© www.soinside.com 2019 - 2024. All rights reserved.