Skip to content

Instantly share code, notes, and snippets.

@hyuki

hyuki/chat.md Secret

Last active July 12, 2023 10:41
Show Gist options
  • Save hyuki/62f87fe12cab743cc1426ed48893c41d to your computer and use it in GitHub Desktop.
Save hyuki/62f87fe12cab743cc1426ed48893c41d to your computer and use it in GitHub Desktop.
#ChatGPT と結城浩の対話: HTMLの<meta>タグを抽出するRubyのプログラム

Model: GPT-4

Date: 2023-07-12

与えられたHTMLファイルを解析して必要な情報をJSON形式で抽出するプログラムをRubyで書いてください。入力ファイル名は input_html という変数に入っていて、「必要な情報」というのは、<meta content="Foo" property="Bar" >です。

RubyにはNokogiriという強力なHTML/XMLパーサーがあり、それを使用してHTMLファイルを解析します。また、Rubyの標準ライブラリにはJSONを処理するための機能があるので、それを使用します。以下にそのコードを示します。

require 'nokogiri'
require 'json'

# HTMLファイルの読み込み
html = File.open(input_html) { |f| Nokogiri::HTML(f) }

# メタタグの抽出
meta_tags = html.xpath('//meta[@property="Bar"][@content="Foo"]')

# 抽出したメタタグをJSON形式に変換
meta_json = meta_tags.map do |tag|
  {'property' => tag['property'], 'content' => tag['content']}
end

# JSONをファイルに出力
File.open('output.json', 'w') do |f|
  f.write(JSON.pretty_generate(meta_json))
end

このスクリプトは、入力として指定されたHTMLファイルから <meta content="Foo" property="Bar" > という形式のメタタグを探し、それらをJSON形式で出力します。出力は 'output.json' ファイルに保存されます。

Nokogiriの xpath メソッドを使って特定のメタタグを探しています。このメソッドはXPath式を使用してHTML文書内の特定の要素を探すことができます。ここでは、property属性が"Bar"で、content属性が"Foo"であるメタタグを探しています。

nokogiriモジュールは大がかりすぎるので、もっと別のモジュールを提案してください。

もちろんです、Rubyの標準ライブラリの一部であるREXMLを使用することも可能です。ただし、REXMLはNokogiriほど強力ではありませんが、あなたの要件には十分なはずです。

以下にそのコードを示します。

require 'rexml/document'
require 'json'

# HTMLファイルの読み込み
file = File.new(input_html)
doc = REXML::Document.new(file)

# メタタグの抽出
meta_tags = REXML::XPath.match(doc, "//meta[@property='Bar'][@content='Foo']")

# 抽出したメタタグをJSON形式に変換
meta_json = meta_tags.map do |tag|
  {'property' => tag.attributes['property'], 'content' => tag.attributes['content']}
end

# JSONをファイルに出力
File.open('output.json', 'w') do |f|
  f.write(JSON.pretty_generate(meta_json))
end

このスクリプトは、入力として指定されたHTMLファイルから <meta content="Foo" property="Bar" > という形式のメタタグを探し、それらをJSON形式で出力します。出力は 'output.json' ファイルに保存されます。

REXMLの XPath.match メソッドを使って特定のメタタグを探しています。このメソッドはXPath式を使用してHTML文書内の特定の要素を探すことができます。ここでは、property属性が"Bar"で、content属性が"Foo"であるメタタグを探しています。

多少エラーが入ってもかまわないので、モジュールなしで正規表現のみで解析することはできますか。

はい、正規表現を使ってHTMLから特定の情報を抽出することは可能ですが、正規表現でHTMLを解析することは通常は推奨されません。というのも、HTMLは非常に複雑で、正規表現だけで完全に解析するのは難しいからです。また、入力HTMLが少しでも期待する形式からずれると、正規表現ベースの解析は失敗する可能性があります。

しかし、あくまで「必要な情報」と指定された特定のメタタグだけを抽出するだけであれば、以下のようなコードで可能です。

require 'json'

# HTMLファイルの読み込み
html = File.read(input_html)

# メタタグの抽出
matches = html.scan(/<meta content="Foo" property="Bar"\s*>/i)

# 抽出したメタタグをJSON形式に変換
meta_json = matches.map do |match|
  {'property' => 'Bar', 'content' => 'Foo'}
end

# JSONをファイルに出力
File.open('output.json', 'w') do |f|
  f.write(JSON.pretty_generate(meta_json))
end

このスクリプトは入力HTMLファイルから <meta content="Foo" property="Bar" > という形式のメタタグを探し、それらをJSON形式で出力します。出力は 'output.json' ファイルに保存されます。

ただし、このコードはメタタグが丁度 <meta content="Foo" property="Bar" > の形式であると仮定しています。例えば、属性の順序が逆であったり、余分な空白が含まれていると、このコードはそれを検出できません。これらのような多くのケースを考慮するためには正規表現を大幅に複雑にする必要があり、それは容易なことではありません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment