我正在尝试使用Hpricot来获取具有我不知道的类名的跨度内的值。我知道它遵循"foo_several digits_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但这并不能运行。有没有办法用正则表达式进行搜索?
发布于 2009-12-30 19:34:54
这应该可以做到:
doc.search("span[@class^='foo'][@class$='bar']")发布于 2011-05-26 18:11:11
这应该可以做到:
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">}]>发布于 2009-12-29 17:05:17
可以在解析之前修改传入的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类来标识元素。这远不是优雅或通用的,但可以证明更有效率。
https://stackoverflow.com/questions/1972934
复制相似问题