実在する姓と名を組み合わせる方法で、テストに使う氏名のデータ作成をしてみた。
明治安田生命のサイトの情報を使おうとしたが、最近の子の名前がさっぱり読めないのであきらめる。
~明治安田生命 全国同姓調査を実施~
https://www.meijiyasuda.co.jp/profile/news/release/2018/pdf/20180808_01.pdf
名前ベスト100
https://www.meijiyasuda.co.jp/enjoy/ranking/best100/index.html
次にbリーグの選手の名前を使用させてもらおうと考えた。
・WSL2, Ubuntu の環境にnokogiriをインストールする。
Installing Nokogiri
https://nokogiri.org/tutorials/installing_nokogiri.html
・以下のプログラムを参考に、指定したURLのページから<a>要素の「文字列」と「href属性のURL」を書き出すプログラムを作成する。
参考にしたプログラム
https://nokogiri.org/#parsing-and-querying
#! /usr/bin/env ruby require 'nokogiri' require 'open-uri' # Fetch and parse HTML document doc = Nokogiri::HTML(URI.open('https://nokogiri.org/tutorials/installing_nokogiri.html')) # Search for nodes by css doc.css('nav ul.menu li a', 'article h2').each do |link| puts link.content end # Search for nodes by xpath doc.xpath('//nav//ul//li/a', '//article//h2').each do |link| puts link.content end # Or mix and match doc.search('nav ul.menu li a', '//article//h2').each do |link| puts link.content end
作成したプログラム
(scrape_a.rb)
#!/usr/bin/env ruby require 'nokogiri' require 'open-uri' # Fetch and parse HTML document doc = Nokogiri::HTML(URI.open(ARGV[0])) puts "### Search for nodes by css" doc.css('a').each do |link| print "#{link.content}\t#{link[:href]}\n" end
・b1のチーム情報のページにアクセスし、各チームの選手一覧のURLを調べる。
https://sportsnavi.ht.kyodo-d.jp/basketball/stats/b1/teams/
・上記のscrape_a.rbを使用して、選手一覧のページから、選手名と個人データのページのURLを取り出す。
$ ./scrape_a.rb https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/teams/player/693/ ... 大浦 颯太 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030513/ 細谷 将司 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008712/ 野本 建吾 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008486/ アレックス・デイビス https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1033045/ 伊藤 駿 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008446/ 中山 拓哉 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1010848/ 長谷川 暢 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1015829/ 多田 武史 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030457/ 保岡 龍斗 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1010878/ ハビエル・カーター https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1025267/ カディーム・コールビー https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1012459/ 古川 孝敏 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008500/ ...
・各選手のページから、氏名、氏名(かな)を取り出す。
大浦 颯太選手のページをみると、氏名、氏名(かな)が見つかる。
https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030513/
... <div class="nameContainer"><h1 class="name">大浦 颯太<span class="kana">OuraSota</span></h1></div> ...
氏名(かな)の方は、class="kana" で取り出せそうだが、氏名の方は、他にclass="name"を使っている箇所があるので、class="nameContainer"を指定して、<h1 class="name">大浦 颯太<span class="kana">OuraSota</span></h1> のくくりでしか取り出せないのか?
ー外国人の氏名(かな)の並びー
アレックス・デイビス選手の場合
... <div class="nameContainer"><h1 class="name">アレックス・デイビス<span class="kana">DavisAlex</span></h1></div> ...
Davisが先になってる。
ケドリック・ストックマン・ジュニア選手の場合
... <div class="nameContainer"><h1 class="name">ケドリック・ストックマン・ジュニア<span class="kana">Stockman Jr.Kedrick</span></h1></div> ...
Jr. が真ん中にきている。!?
ジェームズ・マイケル・マカドゥ選手の場合
... <div class="nameContainer"><h1 class="name">ジェームズ・マイケル・マカドゥ<span class="kana">Michael McadooJames</span></h1></div> ...
ミドルネームがある人は、先頭にきている!どういうルール!?
ジュニア
wikipedia:ジュニア
・選手のURL一覧を読み込み、姓、ミドルネーム、名を個別のファイルに出力するプログラムを作る
(urls.txt)
$ more urls.txt 大浦 颯太 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030513/ 細谷 将司 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008712/ 野本 建吾 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008486/ アレックス・デイビス https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1033045/ ...
(scrape_bbplayer.rb)
#!/usr/bin/env ruby require 'nokogiri' require 'open-uri' require 'uri' file = File.open(ARGV[0], "r") file_name_family = File.open("name_family.txt","w") file_name_middle = File.open("name_middle.txt","w") file_name_first = File.open("name_first.txt","w") file.each do |rec| STDERR.puts rec url = rec.chomp.split(/\t/)[1] begin URI.parse(url) doc = Nokogiri::HTML(URI.open(url)) rescue => e p e next end #氏名の処理 /^<[^>]+>([^<]+)/ =~ doc.at_css('.nameContainer').inner_html name = $1 if /(\S+)・(\S+)・(ジュニア)/ =~ name #外国人(ジュニア) name_first = $1 name_middle = "" name_family = $2 + $3 elsif /(\S+)・(\S+)・(\S+)/ =~ name #外国人(ミドルネームあり) name_first = $1 name_middle = $2 name_family = $3 elsif /(\S+)・(\S+)/ =~ name #外国人(ミドルネームなし) name_first = $1 name_family = $2 name_middle = "" elsif /(\S+)\s(\S+)/ =~ name #日本人 name_family = $1 name_first = $2 name_middle = "" else end #氏名(かな)の処理 kana = doc.at_css('.kana').content if /([A-Z][a-z]+)\s(Jr\.)([A-Z][a-z]+)/ =~ kana #外国人(ジュニア) kana_family = $1 + $2 kana_first = $3 kana_middle = "" elsif /([A-Z][a-z]+)\s([A-Z][a-z]+)([A-Z][a-z]+)/ =~ kana #外国人(ミドルネームあり) kana_family = $2 kana_first = $3 kana_middle = $1 elsif /([A-Z][a-z]+)([A-Z][a-z]+)/ =~ kana #日本人、外国人(ミドルネームなし) kana_family = $1 kana_first = $2 kana_middle = "" else end #姓、ミドルネーム、名をそれぞれファイルに出力する file_name_family.print "#{name_family}\t#{kana_family}\n" file_name_middle.print "#{name_middle}\t#{kana_middle}\n" file_name_first.print "#{name_first}\t#{kana_first}\n" sleep 1 end file.close file_name_family.close file_name_middle.close file_name_first.close
実行結果
$ ./scrape_bbplayer.rb urls.txt 大浦 颯太 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1030513/ 細谷 将司 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008712/ 野本 建吾 https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1008486/ アレックス・デイビス https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1033045/ ... ジョーダン・ヒース https://sportsnavi.ht.kyodo-d.jp/basketball/stats/bleague/player/1026874/ $ nl name_family.txt | more 1 大浦 Oura 2 細谷 Hosoya 3 野本 Nomoto 4 デイビス Davis 5 伊藤 Ito ... 14 アウダ Auda 15 ストックマンジュニア StockmanJr. 16 カーター Carter ... 112 西野 Nishino 113 マカドゥ Mcadoo 114 渡辺 Watanabe ... $ nl name_middle.txt | more 1 2 3 4 5 ... 14 15 16 ... 112 113 マイケル Michael 114 ... $ nl name_first.txt | more 1 颯太 Sota 2 将司 Masashi 3 建吾 Kengo 4 アレックス Alex 5 駿 Takashi ... 14 パトリック Patrik 15 ケドリック Kedrick 16 ロバート Robert ... 112 曜 You 113 ジェームズ James 114 竜之佑 Ryunosuke ...