0

我正在尝试使用 Hpricot 来获取具有我不知道的类名的跨度内的值。我知道它遵循“foo_[几个数字]_bar”的模式。

现在,我将整个包含元素作为字符串获取,并使用正则表达式解析标签的字符串。该解决方案有效,但看起来真的很难看。

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

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

elements = doc.search("//span[@class='" + /foo_\d+_bar/ + "']").inner_html

但这行不通。有没有办法用正则表达式搜索?

4

3 回答 3

3

这应该这样做:

doc.search("span[@class^='foo'][@class$='bar']")

除此之外,我们还可以举一些其他类似表达式如何工作的示例:

对于如下文件:

我们为每个查询获得以下输出:

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

这是我们所期望的。

doc.search("//meta[@content='def']")
=> #<Hpricot::Elements[]>

如您所见 = 正在寻找完全匹配。

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

用 ~ 我们可以做一个子串匹配;但不是你所期望的。

例如看下面。

doc.search("//meta[@content~=' def ']")
=> #<Hpricot::Elements[]>

似乎对空间进行了特殊处理。

有了star,我们可以解决这个问题。现在我们正在做真正的子串匹配。

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

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

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">}]>

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

doc.search("//meta[@content$=' jklmn']")
=> #<Hpricot::Elements[{emptyelem <meta content="abcxy def ghi jklmn">}]>
于 2011-05-26T10:11:10.797 回答
2

这应该这样做:

doc.search("span[@class^='foo'][@class$='bar']")
于 2009-12-30T11:34:54.183 回答
0

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

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该类识别元素。这远非优雅或一般,但可以证明更有效。

于 2009-12-29T09:05:16.597 回答