【问题标题】:Ruby - nokogiri, open-uri - Fail to parse page [closed]Ruby - nokogiri,open-uri - 无法解析页面[关闭]
【发布时间】:2016-01-19 17:06:27
【问题描述】:

此代码适用于某些页面,例如 klix.ba,但无法弄清楚为什么它不适用于其他页面。

没有错误说明出了什么问题,没什么。

如果 puts 页面有效,这意味着我可以定位该页面并对其进行解析,为什么我无法获取单个元素?

require 'nokogiri'
require 'open-uri'


url = 'http://www.olx.ba/'

user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7"


page = Nokogiri::XML(open(url,'User-Agent' => user_agent), nil, "UTF-8")

#puts page - This line work

puts page.xpath('a')

【问题讨论】:

  • 你是从XML解析的,为什么不解析HTML Nokogiri::HTML(open(url)
  • 欢迎来到 Stack Overflow。请阅读“How to Ask”和“minimal reproducible example”。我们需要更好地了解这个问题。您在调试时尝试过什么?哪些网站有效,哪些无效?
  • 对不起,我不知道还能写什么。正如我上面提到的,这是一个没有任何错误消息的奇怪问题。在一个页面上工作得很好,但在另一个页面上失败。然后@Phil M 提到调用 XML 可能会导致问题,他是对的。

标签: ruby web-scraping nokogiri screen-scraping open-uri


【解决方案1】:

首先,为什么要将它解析为 XML? 考虑到您的页面是 HTML 网站,以下内容应该是正确的:

page = Nokogiri::HTML(open(url,'User-Agent' => user_agent), nil, "UTF-8")

此外,如果您想删除所有链接 (a-tags),方法如下:

page.css('a').each do |element|
   puts element
end

【讨论】:

  • each 块不会删除链接。它只遍历它们并打印它们。您应该更改措辞或添加代码以实际剥离它们。但是,为什么还要提到它,因为这不是问题的一部分。
  • 嗨。我理解 OP 就好像他想获取某个网站的所有 a-tags (puts page.xpath('a'))。现在这就是为什么我展示了如何通过 css (page.css('a')) 来处理 a-tag,这将为他提供所有 a-elements。为了输出所述元素(是的,<a href="foo.html">Bar</a> 中的整个元素)我使用了.each 循环。希望能解决问题:)
【解决方案2】:

如果您想解析网页中的内容,您需要这样做:

require 'nokogiri'
require 'open-uri'


url = 'http://www.olx.ba/'

user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7"


page = Nokogiri::HTML(open(url,'User-Agent' => user_agent), nil, "UTF-8")

#puts page - This line work

puts page.xpath('a')

这里看看Nokogiri 文档

我建议的一件事是在代码中使用调试器断点(可能在分配page 之后)。查看Pry-debugger gem。

所以我会这样做:

 require 'nokogiri'
 require 'open-uri'
 require 'pry' # require the necessary library


    url = 'http://www.olx.ba/'

    user_agent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.7) Gecko/2009021910 Firefox/3.0.7"


    page = Nokogiri::HTML(open(url,'User-Agent' => user_agent), nil, "UTF-8")
    binding.pry # stop a moment in time in you code (break point)

    #puts page - This line work

    puts page.xpath('a')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-05
    • 2014-09-15
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2021-05-07
    • 2011-12-10
    • 1970-01-01
    相关资源
    最近更新 更多