【问题标题】:How can I extract the contents of a web page with Ruby?如何使用 Ruby 提取网页的内容?
【发布时间】:2016-05-17 09:53:46
【问题描述】:

例如,如果我想检索乔治克鲁尼出演的电影,我会这样做:

require 'net/http'
require 'nokogiri'
require 'rubygems'

PAGE_URL = "http://www.imdb.com/name/nm0000123" # url for george clooneys profile on imdb
page = Nokogiri::XML(open(PAGE_URL))
puts page.xpath("/html/body/div[1]/div/div[4]/div[3]/div[3]/div[3]/div[3]/div[2]/div[2]").to_s

我在哪里使用 FireBug 提取了 xpath,但是当我运行程序时,我只是在终端中得到一个空行......所以实际上什么都没有发生?我究竟做错了什么?还是有更好的办法?

【问题讨论】:

  • 不要使用 Firebug 或任何基于浏览器的工具来尝试查找选择器。浏览器在显示页面之前对标记进行修复,Firebug 将反映这些更改。修复程序可以更改 HTML,添加/更改标签,这些标签不会出现在 HTML Nokogiri 中,或者您的解析器会看到。而是使用wgetcurl 来查看数据,或者在命令行中使用nokogiri 本身。此外,简化您的选择器。永远不需要使用长的显式 CSS 或 XPath。在文档中找到地标并导航到这些地标。
  • 另外,您需要提供最小化的 HMTL 来说明问题。不要指望我们在远程站点上浏览整个页面。阅读“How to Ask”和“minimal reproducible example”。

标签: html ruby xml http nokogiri


【解决方案1】:

这是我用来获取标题的:

require 'nokogiri'
require 'open-uri'

PAGE_URL = "http://www.imdb.com/name/nm0000123"
page = Nokogiri::XML(open(PAGE_URL))
page.css("div.filmo-category-section b a").each { |movie| puts movie.text }

【讨论】:

  • 感谢您的回答,我现在一直在尝试仅获取“演员”标题下的标题,但没有运气......有什么建议吗?
  • 嗯,对此我不太确定。使用page.css("div.filmo-category-section").children.each {|x| puts x.text } 可以抓取每个 div 中的所有文本,但由于字符名称没有包含在任何 html 标签中,因此我无法直接使用 nokogiri 抓取它。您可能必须抓取整个内容,并解析信息以删除所有\n 并抓取每个相关信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-26
  • 2020-11-22
  • 2013-02-16
  • 2012-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多