如何使用 Nokogiri 和 Mechanize 抓取 <script> 标签
How to scrape <script> tags with Nokogiri and Mechanize
我正在尝试从“St. Paul The Apostle Details Page”中抓取信息。我需要地址、phone 号码和描述。所有这些信息都可以通过普通的 HTML 标签访问,这些标签可以使用 Nokogiri 抓取 ,但是我在 <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
我该怎么做?
您想用 JSON 解析那些:
require 'json'
jsons = page.search('script[type="application/ld+json"]').map{|s| JSON.parse(s.content)}
如果您使用 Mechanize 只是为了检索页面,那么它就太过分了。有许多 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
at
and search
是解析页面的主力军。有 CSS 和 XPath 特定变体,但通常您可以使用通用版本,Nokogiri 会确定使用哪个。所有内容都记录在与 at
和 search
以及教程相同的页面上。
JSON 很聪明,允许我们使用 JSON[...]
的 shorthand 来解析或生成 JSON 字符串。在这种情况下,它将字符串解析回 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"}]}
访问特定的 key/value 对很简单,就像任何其他哈希一样:
foo = JSON[js]
foo['url'] # => "https://www.foodpantries.org/"
您所指的页面有多个脚本与我使用的选择器相匹配,因此您需要使用更精确的选择器进行过滤,或者遍历匹配项并选择所需的脚本。如何使用 CSS、XPath 和 Nokogiri 的文档在 SO 上详细记录了如何做到这一点。
我正在尝试从“St. Paul The Apostle Details Page”中抓取信息。我需要地址、phone 号码和描述。所有这些信息都可以通过普通的 HTML 标签访问,这些标签可以使用 Nokogiri 抓取 ,但是我在 <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
我该怎么做?
您想用 JSON 解析那些:
require 'json'
jsons = page.search('script[type="application/ld+json"]').map{|s| JSON.parse(s.content)}
如果您使用 Mechanize 只是为了检索页面,那么它就太过分了。有许多 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
at
and search
是解析页面的主力军。有 CSS 和 XPath 特定变体,但通常您可以使用通用版本,Nokogiri 会确定使用哪个。所有内容都记录在与 at
和 search
以及教程相同的页面上。
JSON 很聪明,允许我们使用 JSON[...]
的 shorthand 来解析或生成 JSON 字符串。在这种情况下,它将字符串解析回 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"}]}
访问特定的 key/value 对很简单,就像任何其他哈希一样:
foo = JSON[js]
foo['url'] # => "https://www.foodpantries.org/"
您所指的页面有多个脚本与我使用的选择器相匹配,因此您需要使用更精确的选择器进行过滤,或者遍历匹配项并选择所需的脚本。如何使用 CSS、XPath 和 Nokogiri 的文档在 SO 上详细记录了如何做到这一点。