我无法解析页面并获取链接 Nokogiri
I can't parse the page and get links Nokogiri
我无法通过 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
这是行不通的,因为整个页面都是用 JavaScript 创建的。文档的正文只包含一个脚本标签。打开页面源代码或查看原始响应,而不仅仅是查看网络 inspector/developer 工具中呈现的 DOM。
view-source:https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/
Nokogiri 只是一个 HTML 解析器而不是浏览器,因此不是 运行 JavaScript。虽然您可以使用像 phantom.js 这样的无头浏览器,但您可能只想寻找一个 API 来提供您想要的数据。网络抓取工具通常是任何问题的错误答案。
我找到了一个更有趣的解决方案 )) 例如:
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 并获取有关所有版本的信息。如果网站上的版本比我的更新,那么我用新行中的版本号代替下载
chromedriver_storage = 'https://chromedriver.storage.googleapis.com/'
chromedriver = '79.0.3945.36/'
- 开始使用 Capybara 并仅削减版本
zip = 'chromedriver_mac64.zip'
link = chromedriver_storage+chromedriver+zip File.new('filename.zip', 'w') << URI.parse(link).read
原来解析器,在headless模式下,可以插入crontab任务来更新当前浏览器的版本
我无法通过 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
这是行不通的,因为整个页面都是用 JavaScript 创建的。文档的正文只包含一个脚本标签。打开页面源代码或查看原始响应,而不仅仅是查看网络 inspector/developer 工具中呈现的 DOM。
view-source:https://chromedriver.storage.googleapis.com/index.html?path=79.0.3945.36/
Nokogiri 只是一个 HTML 解析器而不是浏览器,因此不是 运行 JavaScript。虽然您可以使用像 phantom.js 这样的无头浏览器,但您可能只想寻找一个 API 来提供您想要的数据。网络抓取工具通常是任何问题的错误答案。
我找到了一个更有趣的解决方案 )) 例如:
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 并获取有关所有版本的信息。如果网站上的版本比我的更新,那么我用新行中的版本号代替下载
chromedriver_storage = 'https://chromedriver.storage.googleapis.com/'
chromedriver = '79.0.3945.36/'
- 开始使用 Capybara 并仅削减版本
zip = 'chromedriver_mac64.zip'
link = chromedriver_storage+chromedriver+zip File.new('filename.zip', 'w') << URI.parse(link).read
原来解析器,在headless模式下,可以插入crontab任务来更新当前浏览器的版本