闘う負け犬

技術習得の努力メモです。

RubyでSQLITE3

RubyでSQLITE3

require 'sqlite3'

#データベースの作成
db = SQLite3::Database.new 'test.db'

#idとnameを持つusersテーブルを作成
sql = <<-SQL
	create table users(
		id integer primary key,
		name text
	);
SQL

#usersテーブルを作成
db.execute(sql)

#テーブルにレコードを書きこむ
db.execute('insert into users(name) values(?)','sample1')
db.execute('insert into users(name) values(?)','sample2')

#データを出力する
db.execute('select * from users') do |row|
	p row
end

RubyでWebページのスクレイピング(mechanize)

Rubyには、mechanizeというライブラリを使うと
スクレイピングが簡単にできそうです。

gem install mechanize

■基本 ホームページデータの取得

require 'mechanize'

sitedata = Mechanize.new
page = sitedata.get("https://www.example.com")
puts page.body

page.links
page.title
page.label
と設定することで便利に使うことができます。

■要素の探索
sitedata = Mechanize.new
page = sitedata.get("https://www.example.com")
elements = page.search('h1 a')
puts elements


ここから先は勉強中です。
わかりやすいサイトです。
【RubyでWebスクレイピング】Mechanizeを使ってスクレイピングをする方法【主要機能まとめ】 - shin>>media


■リンクを操作する方法

require 'mechanize'

sitedata = Mechanize.new
page = sitedata.get('https://www.example.com')
data = page.links  
data.each do |link|
	puts link.text
	puts link.href
end

■フォームの操作

require 'mechanize'
agent = Mechanize.new
page = agent.get('http://example.com/')
puts page.forms

id_form = page.form_with(id: 'id情報')
# page.form_with(class: 'class情報')

id_form.field_with(name: '要素情報').value = '入力値'
# id_form.field_with(id: 'id情報').value = '入力値'

result_form = agent.submit(id_form)

puts result_form.body

■ログインが必要なサイトへのアクセス

login_form = page.form_with(id: 'id情報')
login_form.field_with(name: 'id').value   = 'id'
login_form.field_with(name: 'pass').value = 'password'
after_login_page = agent.submit(login_form)

puts after_login_page.body

■クッキー情報の収集

login_form = page.form_with(id: 'id情報')
login_form.field_with(name: 'id').value   = 'id'
login_form.field_with(name: 'pass').value = 'password'
after_login_page = agent.submit(login_form)

cookies = agent.cookie_jar
hoge = cookies.map { |cookie| cookie }

Rubyでホームページの取得(1)

Rubyでホームページの取得方法は
open-uriを使う方法が簡単です。
他にはnet/httpを使うと、高度な設定が可能です。

例1 open-uri

require "open-uri"
open("https://www.example.com/" do |f|
    print f.read
end

例2 open-uri

require 'open-uri'
io = OpenURI.open_uri('http://www.example.com')
puts io.read

例3 net/http の例

require "net/http"
url = URI.parse("http://www.example.com')
res = Net::HTTP.get_response(url)
puts res.body

例4 net/http 応用

require "net/http"
uri = URI.parse('http://www.example.com/')
data = Net::HTTP.new(uri.host,uri.port)
data.use_ssl = true
res = data.get(uri.parh)
if res.code.to_i == 200
    puts res.body
else
    puts "#{res.code}:#{res.message}"
end

例5 net/http POSTの例

require "net/http"
Net::HTTP.start("www.example.com",80) do |http|
    response = http.post("/cgi-bin/test.cgi",""
       {Content-Type" => "application/x-www-form-urlencoded"})
end

Rubyでnokogiriの利用

Rubyでnokogiriの利用方法です。

Nokogiriは、Rubyでよく使われている構文解析ライブラリです。
注意としてUTF-8以外の場合は注意が必要

例1

require 'nokogiri'
require 'pp'
require 'open-uri'

url = 'https://www.aaaaa.com'

htdata = Nokogiri::HTML(URI.open(url))
data = htdata.css("h3 a").each do |elem|
    pp elem[:href]
end

例2

require 'nokogiri'
require 'open-uri'
doc =Nokogiri.HTML(open('http://www.nokogiri.org/"))
doc.css('a'.each do |element|
    puts element[:href]
end

例3 ページに含まれるリンクを抽出

require 'open-uri'
requrie 'nokogiri'

doc = Nokogiri.HTML(URI.open("http://www.example.com/"))
#ページに含まれるリンクを抽出
doc.css('a').each do  |elem|
    puts elem[:href]
end

例4 h2のテキストを抽出する

require 'open-uri'
requrie 'nokogiri'

doc = Nokogiri.HTML(URI.open("http://www.example.com/"))
doc.xpath('//h2').each do |elem|
    puts.elem.text
end


|

Ruby open-uriのエラー

rubyのopen-uriでエラーが出ました。

initialize': Invalid argument @ rb_sysopen - https://www.aaa.com (Errno::EINVAL)

確認すると、
Rubyの3からは
openではなく、URI.openを使うようです。

require 'open-uri'
url = 'https://www.aaa.com'
#aaa = open(url)                    エラー
aaa = URI.open(url)    Ruby3の場合


ありがとうございます。
hawksnowlog: Ruby3 以降では open-uri は URI.open を使用する必要がある

C++ 部分文字列の取得

C++で部分文字列の取得

#include <string>
#include <iostream>
using namespace std;

void main(void)
{
    string str1("Hello World");
    cout << "右から3文字:" << str1.substr(0,3) << endl;
    cout << "3文字から6文字まで:" << str1.substr(3,6) << endl;
    cout << "6文字以降:" << str1.substr(6) << endl;
}

RubyでCSV

CSVファイルの読み込み

TSV版

require 'csv'
CSV.open("sample.tsv'.col_sep:"\t",headers:true) do |csv|
    csv.read do |row|
         row.each do |header,value|
             puts "#{header}:#{value}"
         end
         puts '-----'
   end
end

CSVファイルの読み込み2

require 'csv'
data = CSV.read('sample.csv')
puts data

CSVファイルの読み込み3

datas = CSV.read('sample.csv')
datas.each do |data|
   puts data[0] + "\t" + data[1]
end

CSVファイルの読み込み4

require 'csv'
CSV.foreach('sample.csv') {|row|
    puts row[0] + "\t" + row[1] + "\t" + row[2]
}

■CSVファイルをテキストに変換する
変数 = <配列>.to_csv

■テキストをCSV配列に変換する
変数 = <テキスト>.parse_csv


■CSVファイルの書き出し
>||
require 'csv'
out = CSV.open('sample2.csv','w')
out << ["A","B","C"]
out << ["Ruby","Python","Rust"]
out.close

CSVファイルの書き出し

require 'csv'
CSV.open('sample2.csv','w') do |out|
    out <<  <配列>
end

■テキストファイルを読み込んでCSVファイルに変換

require 'csv'
result = []
File.foreach('sample.txt') do |line|
    result << line.parse_csv
end
CSV.open('sample.csv','w') do |csv|
    result.each do |row|
        csv << row
    end
end