首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Regex搜索Hpricot

使用Regex搜索Hpricot
EN

Stack Overflow用户
提问于 2009-12-29 12:33:56
回答 3查看 823关注 0票数 0

我正在尝试使用Hpricot来获取具有我不知道的类名的跨度内的值。我知道它遵循"foo_several digits_bar“的模式。

现在,我将整个包含元素作为字符串,并使用正则表达式来解析标记的字符串。这个解决方案是可行的,但它看起来真的很丑陋。

代码语言:javascript
复制
doc = Hpricot(open("http://scrape.example.com/search?q=#{ticker_symbol}"))
elements = doc.search("//span[@class='pr']").inner_html
string = ""
elements.each do |attr|
  if(attr =~ /foo_\d+_bar/)
    string = attr
  end
end
# get rid of the span tags, just get the value
string.sub!(/<\/span>/, "")
string.sub!(/<span.+>/, "")

return string

似乎应该有更好的方法来做到这一点。我想做一些类似的事情:

代码语言:javascript
复制
elements = doc.search("//span[@class='" + /foo_\d+_bar/ + "']").inner_html

但这并不能运行。有没有办法用正则表达式进行搜索?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-12-30 19:34:54

这应该可以做到:

代码语言:javascript
复制
doc.search("span[@class^='foo'][@class$='bar']")
票数 2
EN

Stack Overflow用户

发布于 2011-05-26 18:11:11

这应该可以做到:

代码语言:javascript
复制
doc.search("span[@class^='foo'][@class$='bar']")

除此之外,我们还可以给出一些其他类似表达式的工作原理的例子:

对于如下所示的文档:

对于每个查询,我们都会得到以下输出:

代码语言:javascript
复制
doc.search("//meta[@content='abcxy def ghi jklmn']")
=> #<Hpricot::Elements[{emptyelem <meta content="abcxy def ghi jklmn">}]>

这是我们所期望的。

代码语言:javascript
复制
doc.search("//meta[@content='def']")
=> #<Hpricot::Elements[]>

如您所见,=正在寻找精确匹配。

代码语言:javascript
复制
doc.search("//meta[@content~='def']")
=> #<Hpricot::Elements[{emptyelem <meta content="abcxy def ghi jklmn">}]>

使用~,我们可以进行子字符串匹配;但并不是您所期望的。

例如,请参阅以下内容。

代码语言:javascript
复制
doc.search("//meta[@content~=' def ']")
=> #<Hpricot::Elements[]>

似乎空格是被特殊对待的。

有了star,我们就可以绕过这个问题。现在我们正在进行真正的子字符串匹配。

代码语言:javascript
复制
doc.search("//meta[@content*=' def ']")
=> #<Hpricot::Elements[{emptyelem <meta content="abcxy def ghi jklmn">}]>

我们还可以进行字符串开始和字符串结束匹配,如下所示:

代码语言:javascript
复制
doc.search("//meta[@content^='def']")
=> #<Hpricot::Elements[]>

doc.search("//meta[@content^='ab']")
=> #<Hpricot::Elements[{emptyelem <meta content="abcxy def ghi jklmn">}]>

doc.search("//meta[@content$='mn']")
=> #<Hpricot::Elements[{emptyelem <meta content="abcxy def ghi jklmn">}]>

请注意,对于这些空格,字符不是问题。

代码语言:javascript
复制
doc.search("//meta[@content$=' jklmn']")
=> #<Hpricot::Elements[{emptyelem <meta content="abcxy def ghi jklmn">}]>
票数 3
EN

Stack Overflow用户

发布于 2009-12-29 17:05:17

可以在解析之前修改传入的html。

代码语言:javascript
复制
html = open("http://scrape.example.com/search?q=#{ticker_symbol}").string
html.gsub!(/class="(foo_\d+_bar)"/){ |s| "class=\"foo_bar #{$1}\"" }
doc = Hpricot(html)

之后,您可以使用foo_bar类来标识元素。这远不是优雅或通用的,但可以证明更有效率。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1972934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档