我试图从页面中提取度假村的姓名,地址,电话号码和电子邮件地址
我是Ruby的新手并且已经找了一些例子,但这似乎太具体了,无法找到合适的解决方案。
关注电子邮件地址元素。检查元素'并采用CSS路径(#category-listings> li:nth-child(1)> div> div> ul> li:nth-child(2) > a)
我编写了ruby脚本来尝试提取这些数据:
require 'nokogiri'
require 'open-uri'
PAGE_URL = "http://www.exploreminnesota.com/places-to-stay/resorts/?keywords=&pageIndex=0&radius=0&mapTab=false&sortOrder=asc&sort=randomdaily&locationid=&startDate=false&class_id=7&lat=&lon=&city=&pageSize=20&type=reitlistings&attrFieldsOr="
page = Nokogiri::HTML(open(PAGE_URL))
site1 = page.css(' #category-listings li:nth-child(1) div div ul li:nth-child(2) a')
puts site1
输出:
href="mailto:**%7B%7Br._source.database_fields.email%7D%7D"** class="button gaTracker" title="**{{r._source.database_fields.email}}**" data-tracker-type="event" data-category="Email" data-label="{{r._source.location.split('/')[1]}}" data-action="{{url | analyticsAction}}">Email
正如您所看到的,我想要的电子邮件地址,标题显示为通话: r._source.database_fields.email
检查此元素时,数据显示为:
href="mailto:vacation@gull4seasons.com" class="button gaTracker" title="vacation@gull4seasons.com" data-tracker-type="event" data-category="Email" data-label="gull-four-seasons-resort" data-action="Places to Stay">Email
我不确定如何访问数据,如浏览器建议中所示。任何帮助将不胜感激,也将帮助我理解HTML / CSS,以及如何将数据从数据库中拉入页面。
谢谢!
答案 0 :(得分:1)
以下代码将向exploreminnesota.com发出GET请求,仅 您想要的JSON数据 - 即,您不再需要Nokogiri。然后它会将响应(一个临时文件)转换为一个Ruby JSON对象,并将该对象漂亮地打印到终端。
require "open-uri"
require "json"
url = "http://www.exploreminnesota.com/getJsonData.ashx?id=61&keywords=&pageIndex=0&radius=0&mapTab=false&sortOrder=asc&sort=randomdaily&locationid=&startDate=false&class_id=7&lat=&lon=&city=&pageSize=20&type=reitlistings&attrFieldsOr="
response_file = open(url) # Make HTTP request and save as temp file
response_json = JSON.parse(response_file.read) # Convert response to JSON
puts JSON.pretty_generate(response_json)
请注意分配给getJsonData.ashx
的网址中的url
- 此网址将检索JSON数据而非HTML。
我使用Chrome检查器找到了url
。在检查器中,转到网络选项卡,选中"禁用缓存,"刷新页面,并过滤" XHR"请求类型。在这里,您将看到浏览器在初始页面加载后所做的XHR请求和响应列表(我计算了6)。现在过滤单词" city"你应该看到你关心的一个网络请求。单击它,然后单击"预览"选项卡 - 现在,您可以通过展开和折叠对象来检查检查器中的JSON响应。
如果您在上面的示例中添加以下行:
puts response_json["hits"]["hits"][0]["_source"]["database_fields"]["email"]
它将打印第一个度假村的电子邮件地址。