だめなhtmlのために
みたいなhtmlをrubyのhtmlパーサのhpricotに読ませると、formにinputが含まれなくなる。
こんなだめなhtmlのページをWWW::Mechanizeで操作しなければならなくなってしまった。
$ irb
require 'rubygems'
true
require 'hpricot'
true
doc = Hpricot("<table><form action='hoge'> </table><input name='aa' type='hidden'></form>")
<Hpricot::Doc
{elem <table>
{elem <form action="hoge"> {text " "}}
</table>}
{emptyelem <input name="aa" type="hidden">}
{bogusetag</formform</form>>}>
WWW::Mechanizeで使う情報は、form関連、link関連なので、それ以外をなるべく消去していく。
class WWW::Mechanize::Page
def initialize(uri=nil, response=nil, body=nil, code=nil, mech=nil)
super(uri, response, body, code)
@watch_for_set = {}
@mech = mech
yield self if block_given?
raise Mechanize::ContentTypeError.new(response['content-type']) unless
content_type() =~ /^text\/html/
# construct parser and feed with HTML
if body && response
# 追加
body.gsub!(/<table.*?>/mi, '')
body.gsub!(/<\/table>/mi, '')
body.gsub!(/<tr.*?>/mi, '')
body.gsub!(/<\/tr>/mi, '')
body.gsub!(/<td.*?>/mi, '')
body.gsub!(/<\/td>/mi, '')
body.gsub!(/<th.*?>/mi, '')
body.gsub!(/<\/th>/mi, '')
body.gsub!(/<thead.*?>/mi, '')
body.gsub!(/<\/thead>/mi, '')
body.gsub!(/<tbody.*?>/mi, '')
body.gsub!(/<\/tbody>/mi, '')
body.gsub!(/<tfoot.*?>/mi, '')
body.gsub!(/<\/tfoot>/mi, '')
body.gsub!(/<div.*?>/mi, '')
body.gsub!(/<\/div>/mi, '')
body.gsub!(/<span.*?>/mi, '')
body.gsub!(/<\/span>/mi, '')
@root ||= Hpricot.parse(body)
parse_html
end
end
end
こんなふうに正しくなくなる可能性があるけど、構造の間違いよりずっとよいでしょ。なんか、悲しくなってくるけど。。。
<body> hogehoge </body>