【问题标题】:simple parsing in ruby [duplicate]ruby中的简单解析[重复]
【发布时间】:2012-09-07 13:36:14
【问题描述】:

可能重复:
Method to parse HTML document in Ruby?

如果在变量结果中我有:

<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><link             rel="stylesheet" type="text/css" href="http://2.ai/styles/hello.css" media="screen"/><title>Welcome to Dotgeek.org * 1.ai</title></head><body>..... etc

如果可能的话,我如何在不使用任何 gem 的情况下解析我现在在 results 变量中拥有的那个 HTML 页面的标题?

【问题讨论】:

  • 注意:如果这是用于“一般用途”(即,可以预期任何有效的 HTML),您应该真正使用 HTML 解析器,而不是正则表达式或任何其他不适用的技巧涉及重新创建 DOM
  • 为什么不用宝石? Nokogiri 可以快速准确地解析 HTML,并且是推荐的方法。否则请查看 Ruby 附带的ReXML
  • 是的..Nokogiri.HTML(content).at('title').text #=&gt; "Welcome to Dotgeek.org * 1.ai"
  • 但是如果你可以用 match 做到这一点而不必依赖另一个 gem(因为我只检查标题)为什么我应该使用 gem ? :)

标签: html ruby string parsing


【解决方案1】:
html = '<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"/><link rel="stylesheet" type="text/css" href="http://2.ai/styles/hello.css" media="screen"/><title>Welcome to Dotgeek.org * 1.ai</title></head>'
html.match(/<title>(.*)<\/title>/)[1] #=> "Welcome to Dotgeek.org * 1.ai"

【讨论】:

  • 使用正则表达式解析 HTML 的必填链接:stackoverflow.com/a/1732454/908515
  • 对不起,我不明白。该链接的帖子“解释”了为什么通常应该避免使用正则表达式解析 HTML。所以,我发布了它(尽管我承认在给定正则表达式的情况下可能是合适的)。 Earlz 上面的评论更聪明,但指向了相同的方向。
  • 当然,我没有说你的提议是错误的。但我们不知道具体的问题。也许它是具有公共 Web 界面的任务关键型软件。所以 devnull 应该知道这些限制。
  • 两者都有效 - 我正在解析的页面是一个标准的停车页面,所以我只是检查标题是否是默认标题之一..为什么这不够好或危险?哦!在 1 行中,我可以保存 2 颗宝石(为什么?因为宝石会损坏,我不想依靠 2 颗宝石进行简单检查!!)
  • 作为旁注,转换 html 的简单方法是什么?似乎不适用于具有非标准字符的页面...
【解决方案2】:

您可以像这样简单地按标题标签进行拆分:

title = result.split(/<title>/,2)[1].split(/<\/title>/,2)[0]

(编辑:split 的第二个参数与我在 python 中使用的不同,它不计算分割的数量,而是计算结果数组中的元素数量,这意味着 split(/pattern/, 1) 实际上没有分割任何东西。 ..)

【讨论】:

  • 你好,这似乎也有效,但我在一个似乎使用另一种语言作为标题的网站中遇到问题,请参阅 curl = %x(curl zales.1.ai) simian = curl.match(/ (.*)/)[1] 将 simian throws 放入 <code>&lt;main&gt;': undefined method </code>[]' for nil:NilClass (NoMethodError)
  • match 的调用返回nil,因为它找不到模式,并且尝试在nil 上使用[] 会导致此错误(请参阅stackoverflow.com/questions/3835428/…)。您链接的页面不包含&lt;title&gt; 标签(事实上,这是它的完整来源:&lt;h1&gt;Ahoj svete :)&lt;/h1&gt;),因此您无法匹配它。
猜你喜欢
  • 1970-01-01
  • 2012-03-25
  • 2012-11-18
  • 2016-01-11
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 2019-03-08
相关资源
最近更新 更多