适用于Ruby的HTML,XML,SAX和Reader解析器,能够通过XPath或CSS3选择器搜索文档......等等
Rails 6 - 开发和生产之间的 Nokogiri LoadError 冲突(x86_64-darwin 和 x86_64-linux)
当我尝试使用 capistrano gem 进行部署时,我得到: rake stderr:rake 中止! LoadError:无法加载此类文件 -- nokogiri/nokogiri 在我的 Gemfile.lock 中,我可以看到 nokogiri 已安装 nokogiri (1.1...
如何升级 nokogiri 与我的 Rails 和 ruby 版本兼容
我试图启动一个rails项目(版本6.x),其中出现了nokogiri错误: 错误:安装导轨时出错: nokogiri 的最新版本 (>= 1.8.5) 支持您的 Ruby &
Nokogiri 安装错误并在 macOS 14 Sonoma 上失败
我正在尝试使用 Sonoma 14.4 和我的 ruby 项目在 x86 intel mac 上安装旧版本的 nokogiri (1.6.8.1),但我在捆绑安装或 gem 安装时遇到问题...
我目前正在使用 Ruby 和 xPath 开发一个小型网络抓取项目。不幸的是,该网站的结构非常糟糕,这给我带来了一个小问题: 相关标题 我目前正在使用 Ruby 和 xPath 开发一个小型网络抓取项目。不幸的是,该网站的结构非常糟糕,这给我带来了一个小问题: <h3>Relevant Headline</h3> <p class="class_a class_b">Content starts in this paragraph...</p> <p class="class_a ">...but this content belongs to the preceding paragraph</p> <p class="class_a class_b">Content starts in this paragraph...</p> <p class="class_a ">...but this content belongs to the preceding paragraph</p> <h3>Some other Headline</h3> 如您所见,有 2 个 h3-Tags 框住了多个 p-tags。我希望选择所有带框的 p 标签。我已经找到了以下 xPath 来做到这一点: h3[contains(text(),"Relevant")]/following-sibling::p[1 = count(preceding-sibling::h3[1] | ../h3[contains(text(),"Relevant")])] 但现在困难来了:上面的两段是在一起的。 class_b 的段落(第一个)开始一个新的数据条目,下一个(第二个)属于该条目。 3和4是一样的。问题是:有时 3 个段落属于在一起,有时是 4 个段落,但大多数时候有一对段落属于在一起。 如何在 Ruby 中按组选择这些内部段落并将它们组合成一个字符串? 如果您不介意使用 xpath 和 nokogiri 的组合,您可以这样做: paragraph_text = Array.new doc.xpath('//p[preceding-sibling::h3[1][contains(text(), "Relevant")]]').each do |p| if p.attribute('class').text.include?('class_b') paragraph_text << p.content else paragraph_text[-1] += p.text end end puts paragraph_text #=> ["Content starts in this paragraph......but this content belongs to the preceding paragraph", "Content starts in this paragraph......but this content belongs to the preceding paragraph"] xpath 基本上用于获取段落标签。然后,使用 nokogiri/ruby 迭代段落并制定字符串。 可以用 xpath 来完成,但我认为用 slice_before 将它们分组更容易: doc.search('*').slice_before{|n| n.name == 'h3'}.each do |h3_group| h3_group.slice_before{|n| n[:class] && n[:class]['class_b']}.to_a[1..-1].each do |p_group| puts p_group.map(&:text) * ' ' end end 更新 使用 css 的另一个选项: doc.search('p.class_b').each do |p| str, next_node = p.text, p while next_node = next_node.at('+ p:not([class*=class_b])') str += " #{next_node.text}" end puts str end
是否有更好的方法使用 Nokogiri 提取网页上的可见文本?目前我使用 inner_text 方法,但是该方法将大量 JavaScript 计为可见文本。 我唯一的文字
在我的场景中,我正在抓取一个内容由 javascript 生成的网站。我知道 watir 非常适合我的情况,但众所周知,它往往会增加一点开销并使程序......
使用 Nokogiri 和 Ruby 抓取 iframe 数据 [已关闭]
这是我编写的脚本,用于使用 Nokogiri 抓取 标签内的数据: 需要“nokogiri” 需要“休息客户端” doc = Nokogiri::HTML(RestClient.get("http://www.sample_site.com/")) ...</desc> <question vote="0"> <div> </div> <p>这是我编写的脚本,用于使用 Nokogiri 抓取 <pre><code><iframe></code></pre> 标签内的数据:</p> <pre><code>require 'nokogiri' require 'restclient' doc = Nokogiri::HTML(RestClient.get("http://www.sample_site.com/")) doc.xpath('//iframe[@width="1001" and @height="973"]').children </code></pre> <p>我现在变成这样了:</p> <pre><code>=> [#<Nokogiri::XML::Text:0x1913970 "\r\nYour browser does not support inline frames\r\n">] </code></pre> <p>谁能告诉我为什么?</p> </question> <answer tick="false" vote="2"> <p><strong><pre><code>iframe</code></pre> 用于在当前 HTML 文档中嵌入另一个文档</strong>。这意味着 iframe 从 <pre><code>src</code></pre> 属性中指定的外部源加载其内容。</p> <p>因此,如果您想抓取<pre><code>iframe</code></pre>内容,您应该向外部源发送请求,从外部源加载其内容。</p> <pre><code># The iframe (notice the 'src' attribute) <iframe src="iframe_source_url" height="973" width="1001"> # iframe content </iframe> # Code to do the scraping doc = RestClient.get('iframe_source_url') parsed_doc = Nokogiri::HTML(doc) parsed_doc.css('#yourSelectorHere') # or parsed_doc.xpath('...') </code></pre> <p><strong>注意(关于错误)</strong></p> <p>当您进行抓取时,您使用的 HTTP 客户端将充当您的浏览器(您的是 <pre><code>restclient</code></pre>)。该错误表明您的浏览器不支持内联框架,换句话说,<pre><code>restclient</code></pre>不支持内联框架,这就是它无法加载框架内容的原因。</p> </answer> <answer tick="false" vote="0"> <p>这个问题应该向<pre><code>RestClient</code></pre>提出,而不是向<pre><code>Nokogiri</code></pre>提出。</p> <p><pre><code>RestClient</code></pre> 不检索 <pre><code>iframe</code></pre> 的内容。你可能想尝试检查 <pre><code>RestClient.get("http://www.sample_site.com/")</code></pre> 的内容,会有这样的字符串:</p> <pre><code><iframe src="page-1.htm" name="test" height="120" width="600"> You need a Frames Capable browser to view this content. </iframe> </code></pre> <p><pre><code>Nokogiri</code></pre> 可以很好地处理这个问题,它返回 <pre><code>iframe</code></pre> 节点的内容,这显然是唯一一个具有您生成的字符串的 <pre><code>TextNode</code></pre>。</p> </answer> </body></html>
如何使用 Nokogiri 解析 Wikipedia 中的深度嵌套文本?
我正在尝试从 http://en.wikipedia.org/wiki/List_of_current_NBA_team_rosters 获取所有球员姓名的列表 这是我的新手代码: AllPlayersScraper 类 attr_accessor:
如何使用 Ruby 抓取由 Javascript 函数生成的数据?
我正在尝试从此页面中抓取最新日期(即表格的第一行)的数据 URL 链接。表格的内容似乎是由 JavaScript 函数生成的。 我...
我正在用这个。 doc = Nokogiri::HTML(打开(url)) pic = doc.search "[text()*='hiRes']" 获取此脚本节点: 变量数据 = { 'colorImages':{ '初始': [{“...</desc> <question vote="0"> <p>我正在用这个。</p> <pre><code>doc = Nokogiri::HTML(open(url)) pic = doc.search "[text()*='hiRes']" </code></pre> <p>获取此脚本节点:</p> <pre><code><script type="text/javascript"> var data = { 'colorImages': { 'initial': [{"hiRes":"http://ecx.images-joes.com/images /I/71MBTEP1W9L._UL1500_.jpg","thumb":"http://ecx.images-joes.com/images /I/41xE2XADIvL._US40_.jpg","large":"http://ecx.images-joes.com/images /I/41xE2XADIvL.jpg","main":{"http://ecx.images-joes.com/images /I/71MBTEP1W9L._UX395_.jpg":[395,260],"http://ecx.images-joes.com/images /I/71MBTEP1W9L._UX500_.jpg":[500,329],"http://ecx.images-joes.com/images /I/71MBTEP1W9L._UX535_.jpg":[535,352],"http://ecx.images-joes.com/images /I/71MBTEP1W9L._UX575_.jpg":[575,379]} </code></pre> <p>节点从那里继续前进..</p> <p>但我唯一需要提取的是包含该字符串的整个 URL。 “UL1500”或“hiRes:”后面的 URL.. 例如。 <a href="http://ecx.images-joes.com/images/I/71MBTEP1W9L._UL1500_.jpg" rel="nofollow">http://ecx.images-joes.com/images/I/71MBTEP1W9L.<em>UL1500</em>.jpg</a></p> <p>我查找了 Nokogiri 返回的类,它是 Nokogiri::XML::NodeSet</p> <p>但我不确定如何与其交互以获得我需要的东西?</p> <p>谢谢</p> </question> <answer tick="true" vote="0"> <p>我从只使用 Nokogiri 转向正则表达式..但最终找到了这个,它就像魔术一样!!</p> <p><a href="https://stackoverflow.com/a/5939906/4386626">https://stackoverflow.com/a/5939906/4386626</a></p> </answer> <answer tick="false" vote="0"> <p>是的。由于一般情况,它是一个 NodeSet。 </p> <p>参见:<a href="http://www.rubydoc.info/github/sparklemotion/nokogiri/master/Nokogiri/XML/NodeSet#children-instance_method" rel="nofollow">http://www.rubydoc.info/github/sparklemotion/nokogiri/master/Nokogiri/XML/NodeSet#children-instance_method</a></p> <p>在这种情况下你可以尝试:</p> <pre><code>pic.children.first.content </code></pre> </answer> </body></html>
使用 Ruby 抓取通过 Javascript 加载的数据的 URL
我正在尝试使用 Ruby 脚本抓取此页面的租赁列表。 我尝试过的一些不成功的方法是使用 Nokogiri 和 Mechanize,但是浏览器只加载 14 lis...
使用 Nokogiri::HTML 和 Ruby 进行网页抓取 - 如何将输出放入数组中?
我刚刚开始使用 nokogiri 从网站上抓取信息,但不知道如何完成以下操作。我有一些想要抓取的 HTML 代码: ... 我刚刚开始使用 nokogiri 从网站上抓取信息,但不知道如何完成以下操作。我有一些 HTML 代码想要抓取: <div class="compatible_vehicles"> <div class="heading"> <h3>Compatible Vehicles</h3> </div><!-- .heading --> <ul> <li> <p class="label">Type1</p> <p class="data">All</p> </li> <li> <p class="label">Type2</p> <p class="data">All</p> </li> <li> <p class="label">Type3</p> <p class="data">All</p> </li> <li> <p class="label">Type4</p> <p class="data">All</p> </li> <li> <p class="label">Type5</p> <p class="data">All</p> </li> </ul> </div><!-- .compatible_vehicles --> 我已经成功地在屏幕上获得了我想要的输出: i = 0 doc.css('div > .compatible_vehicles > ul > li').each do |item| label = item.at_css(".label").text data = item.at_css(".data").text print "#{label} - #{data}" + ',' end i += 1 这给了我一个这样的列表:Type1 - All,Type2 - All,Type3 - All,Type4 - All,Type5 - All, 在屏幕上。 现在我想在数组中获取这个值,以便能够将其保存到 CSV 文件中。我尝试了一些方法,但大多数尝试都会出现“无法将字符串转换为数组”错误。 希望有人能帮我解决这个问题! 从 HTML 开始: html = ' <div class="compatible_vehicles"> <div class="heading"> <h3>Compatible Vehicles</h3> </div><!-- .heading --> <ul> <li> <p class="label">Type1</p> <p class="data">All</p> </li> <li> <p class="label">Type2</p> <p class="data">All</p> </li> <li> <p class="label">Type3</p> <p class="data">All</p> </li> <li> <p class="label">Type4</p> <p class="data">All</p> </li> <li> <p class="label">Type5</p> <p class="data">All</p> </li> </ul> </div><!-- .compatible_vehicles --> ' 使用 Nokogiri 解析它并循环 <li> 标签以获取其 <p> 标签内容: require 'nokogiri' doc = Nokogiri::HTML(html) data = doc.search('.compatible_vehicles li').map{ |li| li.search('p').map { |p| p.text } } 返回数组的数组: => [["Type1", "All"], ["Type2", "All"], ["Type3", "All"], ["Type4", "All"], ["Type5", "All"]] 从那里您应该能够将其插入到 CSV 类的示例中并让它毫无问题地工作。 现在,将输出到屏幕字段的代码与此进行比较: data.map{ |a| a.join(' - ') }.join(', ') => "Type1 - All, Type2 - All, Type3 - All, Type4 - All, Type5 - All" 我所要做的就是puts,它就会正确打印。 考虑返回有用的数据结构非常重要。在 Ruby 中,哈希和数组非常有用,因为我们可以迭代它们并将它们转换为多种形式。从数组的数组中创建一个散列是很简单的: Hash[data] => {"Type1"=>"All", "Type2"=>"All", "Type3"=>"All", "Type4"=>"All", "Type5"=>"All"} 这将使查找变得非常容易。
使用 Nokogiri::HTML 和 Ruby 进行网页抓取 - 保存图像
我正在编写一个脚本来从网上商店产品页面获取数据和图像 (经业主同意) 我有一个工作脚本,它循环遍历包含 20042 个产品 URL 的 CSV 文件来获取...
使用 Nokogiri::HTML 和 Ruby 进行网页抓取 - 输出到 CSV 问题
我有一个脚本可以抓取网上商店的 HTML 文章页面。我正在使用一组 22 页进行测试,其中 5 个文章页面有产品描述,其他页面没有。 这段代码正确...
Nokogiri 安装错误并在 mac os x 14 Sonova 上失败
我正在尝试使用 sonova 14.4 和我的 ruby 项目在 x86 intel mac 上安装旧版本的 nokogiri (1.6.8.1),但我在捆绑安装或 gem 安装时遇到问题...
使用 Ruby、Nokogiri 和 Mechanize 网页中的 java cookies 链接进行解析
大家。 我需要解析一个为每个链接设置了 java cookie 的网页。我可以解析正常的搜索,并且每个产品都会显示并导入到 mysql 数据库中。 我能够从
我正在构建一个抓取/解析方法,但是我正在使用的网站(https://www.bbcgoodfood.com/search?q=banana)使用相同的类获取许多不同的信息(它们哈...
我正在尝试在控制器中编写一个方法,以获取有关餐厅的基本信息(给定谷歌地图链接),并创建一个餐厅对象。如果可能的话我也想抓取这些图像。我是
我们使用第三方提供的 XSLT 转换来验证 XML 文档;它将文档转换为错误节点的集合,如果 XML 文档为 val,则该集合将为空...
fedora 40 上的 vagrant(和 nokogiri)错误
在新安装的 Fedora 40 发行版上,我想使用 vagrant 但出现错误(似乎是 nokogiri 的问题)。 我认为 vagrant 并没有像它可能的那样被打包,或者可能是一个依赖项......