我无法解析页面并获取链接 Nokogiri

Posted

技术标签:

【中文标题】我无法解析页面并获取链接 Nokogiri【英文标题】:I can't parse the page and get links Nokogiri 【发布时间】:2020-05-05 18:07:54 【问题描述】:

我无法通过 Nokogiri 解析获得链接列表,https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/

我做错了什么?

links = Nokoiri::HTML('https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/')

links = Nokoiri::XML('https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/')

--->

#(Document:0x3fcdda1b988c 
  name = "document",
  children = [
    #(DTD:0x3fcdda1b5b24  name = "html" ),
    #(Element:0x3fcdda1b46fc 
      name = "html",
      children = [
        #(Element:0x3fcdda1b0804 
          name = "body",
          children = [
            #(Element:0x3fcdda1ac920 
              name = "p",
              children = [ #(Text "https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/")]
              )]
          )]
      )]
  )
puts links.to_html
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/</p></body></html>
=> nil

【问题讨论】:

在寻求帮助调试时,我们需要最少的代码和输入数据来证明问题和您所需的输出。超出最小限度的任何事情都会浪费我们的时间来帮助您,这会浪费您的时间。请参阅“MCVE”和“How to debug small programs”。要求我们从网站加载页面意味着我们必须搜索它以找到您正在谈论的部分。在这方面浪费了我们太多时间,我们会继续前进,所以请帮助我们为您提供帮助。 使用 nokogiriwgetcurl 检索浏览器看到的确切页面。这些工具不处理 DHTML,因此它们不支持 CSS 或 javascript,它们返回的页面是 Nokogiri 处理的基础。 @the Tin Man 这个问题有什么不清楚的地方?一个简单的问题——为什么 Nokogiri 不能解析这个页面的名称 简单的答案——如果需要 js,Nokogiri 不会解析页面这就是我需要弄清楚问题所在。我已经找到了一些不依赖于 chromedriver 并且能够使用 ruby​​ 下载更新版本而无需 curl 的选项。如果我可以自动化一个脚本来检查系统中驱动程序的当前版本,并用站点上的最新版本替换它,为什么我需要 curl?我不明白你的不满...... 在编写任何代码之前,您应该使用其中一种工具来查看页面以确定它在做什么,或者至少关闭浏览器中的 JavaScript 并查看页面元素的作用出现。任何不可见的东西很可能需要 JavaScript 处理。如果您已将其作为第一步,那么您甚至不需要问这个问题。 SO 在这方面有很多问题,所以搜索和阅读会给你指点。 另外,当询问像这样的网络抓取问题时,我们需要最少的代码和输入数据来测试问题在问题本身中。如果您这样做了,您将在编写和测试代码时自己回答您的问题。 【参考方案1】:

这是行不通的,因为整个页面都是用 JavaScript 创建的。文档的正文只包含一个脚本标签。打开页面源或查看原始响应,而不是只查看 Web 检查器/开发人员工具中呈现的 DOM。

view-source:https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/

Nokogiri 只是一个 HTML 解析器而不是浏览器,因此不运行 JavaScript。虽然您可以使用像 phantom.js 这样的无头浏览器,但您可能只想寻找一个提供所需数据的 API。网络爬虫通常是任何问题的错误答案。

【讨论】:

在 ruby​​ 中解析 js 有什么建议? 不是解析JS的问题。您需要一个具有 DOM 并运行 javascript 的实际浏览器。您可以使用 capybara 自动化浏览器。但正如我在答案中所说,这可能是一个愚蠢的想法,因为您可能可以通过 API 获取数据,而 API 会为您提供 JSON。网络抓取非常脆弱,随着时间的推移它会崩溃。 除非您实际上是在浏览器中打开页面并在 js 运行后复制呈现的 HTML,否则我看不出这会如何改变任何事情。放弃。它不会工作。【参考方案2】:

我找到了一个更有趣的解决方案))例如: link_driver = Nokogiri::HTML(page.source).at('a:contains("mac")').values.join('') chromedriver_storage_page = 'https://chromedriver.storage.googleapis.com/' File.new('filename.zip', 'w') &lt;&lt; URI.parse(chromedriver_storage+link).read

contains("mac")可以改contains("linux")或者contains("win"),没关系,随便选操作系统版本

还有 2 个解决方案 - 解析页面 chromedriver.chromium.org 并获取有关所有版本的信息。如果网站上的版本比我的更新,那么我会在新行中替换版本号以进行下载chromedriver_storage = 'https://chromedriver.storage.googleapis.com/'chromedriver = '79.0.3945.36/' - 使用 Capybara 并仅剪切版本@987654326 @link = chromedriver_storage+chromedriver+zip File.new('filename.zip', 'w') &lt;&lt; URI.parse(link).read

原来解析器,在无头模式下,可以插入到crontab任务中来更新当前浏览器的版本

【讨论】:

以上是关于我无法解析页面并获取链接 Nokogiri的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Nokogiri 解析 HTML 表格?

使用Savon和Nokogiri在Rails中解析XML SOAP响应的内存不足

无法从具有不同深度的某些链接中解析产品名称

IPFS 生成的链接无法解析

在linkedin页面中发布共享时,已解析的URL无法正常工作

如何在 Nokogiri 中解析图像 href