HpricotのXPATHを使って属性名の小文字大文字を無視する
HpricotのXPATHではlower-caseとupper-caseは使えなかったんですね。アイター。
ということでさっくりとコードいじりました。
例えばmetaタグのdescriptionを取り出すときに、以下のように大文字になっていると
<meta NAME="DESCRIPTION" ...>
次のようなxpathでは取り出せません。
//head/meta[@name=description]
これを解決するには以下のようにxpathの関数を使うのが理想なのですが
//head/meta[lower-case(@name)=description]
Hpricotでの実現方法が分からなかったのでElem::Travを直でいじるという乱暴な方法で解決しました。
#
# 属性へのアクセスは全て小文字に揃えます。
#
module Hpricot
module Elem::Trav
def has_attribute?(name)
self.raw_attributes && self.raw_attributes.has_key?(name.to_s.downcase)
end
def get_attribute(name)
a = self.raw_attributes && self.raw_attributes[name.to_s.downcase]
a = Hpricot.uxs(a) if a
a = a.downcase if (a && self.name.downcase == "meta" && name == "name")
a
end
alias_method :[], :get_attribute
def set_attribute(name, val)
altered!
self.raw_attributes ||= {}
self.raw_attributes[name.to_s.downcase] = val.fast_xs
end
alias_method :[]=, :set_attribute
def remove_attribute(name)
name = name.to_s.downcase
if has_attribute? name
altered!
self.raw_attributes.delete(name)
end
end
end
end
これでmetaタグのname属性だけが全て小文字に揃います。








