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

I can't parse the page and get links Nokogiri

提问人:Vitalii 提问时间:1/19/2020 更新时间:1/20/2020 访问量:277

问:

我无法通过 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
ruby xml 解析 html 解析 nokogiri

评论

0赞 the Tin Man 1/20/2020
在寻求帮助调试时,我们需要最少的代码和输入数据来演示问题和所需的输出。任何超出最低限度的事情都会浪费我们的时间帮助您,从而浪费您的时间。请参阅 “MCVE” 和 “如何调试小程序”。要求我们从网站加载页面意味着我们必须搜索它才能找到您正在谈论的部分。浪费我们太多的时间,我们会继续前进,所以请帮助我们帮助您。
0赞 the Tin Man 1/20/2020
使用 或 或 检索浏览器看到的确切页面。这些工具不处理 DHTML,因此它们不支持 CSS 或 JavaScript,它们返回的页面是 Nokogiri 处理内容的基础。nokogiriwgetcurl
0赞 Vitalii 1/20/2020
@the 铁皮人 问题中有什么不清楚的?一个简单的问题 - 为什么 Nokogiri 不能解析这个页面的名称 简单的答案 - 是 Nokogiri 如果需要 js 就不解析页面 这就是我找出问题所在所需要的全部内容。我已经找到了一些不依赖 chromedriver 的选项,并且能够使用 ruby 下载更新版本,而无需 curl。如果我可以自动执行一个脚本来检查系统中驱动程序的当前版本,并使用网站上的最新版本并替换它,为什么我需要 curl?我不明白你的不快......
0赞 the Tin Man 1/21/2020
在编写任何代码之前,您应该使用其中一个工具来查看页面以确定它正在做什么,或者至少在浏览器中关闭 JavaScript,看看哪些页面元素没有出现。任何不可见的内容都很可能需要 JavaScript 处理。如果你把这作为第一步来做,你甚至不需要问这个问题。SO 在这方面有很多问题,因此搜索和阅读会为您提供指导。
0赞 the Tin Man 1/21/2020
此外,当询问诸如此类的网络抓取问题时,我们需要最少的代码和输入数据来测试问题本身的问题。如果你这样做了,你就会在编写和测试代码时自己回答你的问题。

答:

1赞 max 1/20/2020 #1

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

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

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

评论

0赞 Vitalii 1/20/2020
在 ruby 中解析 js 有什么建议?
1赞 max 1/20/2020
这不是解析 JS 的问题。您需要一个具有 DOM 并运行 javascript 的实际浏览器。您可以使用 capybara 自动化浏览器。但正如我在回答中所说,这可能是一个愚蠢的想法,因为您可以通过 API 获取数据,该 API 会为您提供 JSON。网络抓取真的很脆弱,随着时间的推移,这种情况只会破裂。
1赞 max 1/20/2020
我看不出这会如何改变任何事情,除非您实际在浏览器中打开页面并在 js 运行后复制呈现的 HTML。放弃吧。它不会起作用。
0赞 Vitalii 1/20/2020 #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') << URI.parse(chromedriver_storage+link).read

contains(“mac”) 可以更改 contains(“linux”) 或 contains(“win”),没关系,选择任何版本的操作系统

和 2 解决方案 - 解析页面 chromedriver.chromium.org 并获取有关所有版本的信息。如果网站上的版本比我的版本新,那么我会在新行中替换版本号以供下载

- 使用 Capybara 并仅剪切版本
chromedriver_storage = 'https://chromedriver.storage.googleapis.com/'chromedriver = '79.0.3945.36/'
zip = 'chromedriver_mac64.zip'
link = chromedriver_storage+chromedriver+zip File.new('filename.zip', 'w') << URI.parse(link).read

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