我不确定我如何选择带正则表达式的标题。我试过了
match(/<title>(.*) .*<\/title>/)[1]
但这并不匹配。
This是我试图选择的响应主体。
尝试选择"title I need to select."
答案 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
当键是键时,返回包含对的集合的哈希 节点名称和值是其内容
现在您可以执行类似
的操作hash = Hash.from_xml('XML')
hash.title # my favorite book
答案 4 :(得分:0)
答案 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变得越来越复杂,情况会变得更糟,尤其是当您不控制内容的生成时。