使用正则表达式获得标题

时间:2017-02-01 15:54:26

标签: ruby-on-rails ruby regex match

我不确定我如何选择带正则表达式的标题。我试过了

match(/<title>(.*) .*<\/title>/)[1]

但这并不匹配。

This是我试图选择的响应主体。

尝试选择"title I need to select."

6 个答案:

答案 0 :(得分:2)

它不起作用的原因是itemprop=\"name\"属性。要解决此问题,您也可以匹配它:

# copy-paste from the page you provided
html = '<!doctype html>\n<html lang=\"en\" itemscope itemtype=\"https://schema.org/WebPage\">\n<head>\n<meta charset=\"utf-8\"><meta name=\"referrer\" content=\"always\" />\n<title itemprop=\"name\">title I need to select.</title>\n<meta itemprop=\"description\" name=\"description\" content=\\'

html.match(/<title.*?>(.*)<\/title>/)[1] # => "title I need to select."

.*?基本上意味着&#34;匹配需要多个字符,但不是更多&#34;

然而,正如其他人所指出的,正则表达式不适合html解析。相反,你可以为此目的使用流行的红宝石宝石 - Nokogiri

require 'nokogiri'

page = Nokogiri.parse(html)
page.css('title').text # => "title I need to select."

请注意,它可以处理格式错误的html,就像这里的情况一样。

答案 1 :(得分:2)

如果您正在寻找更强大的XML / HTML解析器,请尝试使用支持XPath的Nokogiri。

这篇文章解释了原因 Use xPath or Regex?

require "nokogiri"
string = "<title itemprop=\"name\">title I need to select.</title>"
html_doc = Nokogiri::HTML(string)
html_doc.xpath("//title").first.text

答案 2 :(得分:1)

以下是可以满足您需求的正则表达式: <title.*>(.*)<\/title>

如前所述,有更好的方法来解析HTML。您可能需要查看Nokogiri之类的内容。

答案 3 :(得分:0)

当我必须从XML获取元素时,我喜欢将其转换为哈希

  

from_xml(xml,disallowed_types = nil)public

     

当键是键时,返回包含对的集合的哈希   节点名称和值是其内容

     

http://apidock.com/rails/Hash/from_xml/class

现在您可以执行类似

的操作
hash = Hash.from_xml('XML')
hash.title # my favorite book

答案 4 :(得分:0)

一种解决方案是使用以下模式:

<title.*?>(.*?)<\/title>

https://regex101.com/r/piwm5H/1

答案 5 :(得分:0)

在处理XML或HTML数据时使用HTML / XML解析器,但非常简单的情况除外。对于普通的正则表达式,HTML和XML过于复杂。

使用Nokogiri我做:

require 'nokogiri'

some_html = '
<html>
  <head>
    <title>the title</title>
  </head>
</html>
'

doc = Nokogiri::HTML(some_html)
doc.title # => "the title"

Nokogiri已经有了返回标题的方法,因此您可以利用它。或者,你可以通常的方式做到:

doc.at('title').text  # => "the title"

正则表达式的问题在于HTML可以用多种方式编写:

<title>foo</title>

或:

<title>
  foo
</title>

甚至:

<title>foo
</head>

虽然不正确,但会被浏览器接受并由Nokogiri修复,然后仍然有效。编写模式来处理这些变体是一种痛苦且容易出错的问题。随着HTML变得越来越复杂,情况会变得更糟,尤其是当您不控制内容的生成时。