正規表現で行末まで取得ができない場合は、Nokogiriのchildrenメソッドで該当行を探す
こういうNokogiriのElementが存在する。pタグで囲んでテキストの文章を書きながら、<br>
で改行をいれていく普通の文章。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#(Element:0x3fe4f61a9d14 { name = "p", children = [ #(Text "※1. 出発駅:土浦・横浜・八王子・千葉/上野・大宮・熊谷・本庄早稲田・高崎"), #(Element:0x3fe4f58fa95c { name = "br" }), #(Element:0x3fe4f614fdf0 { name = "br" }), #(Text "※千葉・横浜・八王子(中央線経由)~東京、土浦~上野間は普通列車利用となります。"), #(Element:0x3fe4f614e6a8 { name = "br" }), #(Text "※北陸新幹線では相互の乗り継ぎはできません。"), #(Element:0x3fe4f614781c { name = "br" }), #(Text "※北陸新幹線「はくたか」号の停車しない駅をご利用の場合、高崎駅で上越新幹線と"), #(Element:0x3fe4f6146ac0 { name = "br" }), #(Text " 北陸新幹線「はくたか」号を乗り継いでください。この場合、上越新幹線は自由席のご利用となります。"), #(Element:0x3fe4f612b928 { name = "br" }), #(Text " また、高崎駅では改札の外に出ることはできません。"), #(Element:0x3fe4f612adac { name = "br" }), #(Text "※長野駅に限り北陸新幹線「あさま」号と「かがやき」号を乗り継ぐことができます。"), #(Element:0x3fe4f612a0dc { name = "br" }), #(Text " この場合、長野駅で改札の外に出ることはできません。"), #(Element:0x3fe4f611e4a8 { name = "br" }), #(Text "※JR券は施設の最寄駅の往復となります。"), #(Element:0x3fe4f6103464 { name = "br" }), #(Text "◆片道3,800円(東京-金沢)で、さらに快適なグリーン車をご利用いただけます。"), #(Element:0x3fe4f6102690 { name = "br" }), #(Text "◆[かがやき利用OK!]片道:おとな800円増、こども400円増"), #(Element:0x3fe4f60f7614 { name = "br" }), #(Text " 北陸新幹線「かがやき」号は全車指定席です。自由席はございません。指定席が確保された場合のみ発売いたします。"), #(Element:0x3fe4f60db054 { name = "br" }), #(Text " 往路・復路とも12/29~1/4の乗車は「かがやき」号の割増代金はございません。")] }) |
取得したい文章は以下の駅名一覧
1 2 |
出発駅:土浦・横浜・八王子・千葉/上野・大宮・熊谷・本庄早稲田・高崎 |
正規表現で「出発駅」から行末まで取ってくればいいだろうと考えるが、
1 2 3 4 5 |
pp doc.css("p").first.text.match(/出発駅.*?\$/) #出力結果 #"※1. 出発駅:土浦・横浜・八王子・千葉/上野・大宮・熊谷・本庄早稲田・高崎※千葉・横浜・八王子(中央線経由)~東京、土浦~上野間は普通列車利用となります。※北陸新幹線では相互の乗り継ぎはできません。※北陸新幹線「はくたか」号の停車しない駅をご利用の場合、高崎駅で上越新幹線と 北陸新幹線「はくたか」号を乗り継いでください。この場合、上越新幹線は自由席のご利用となります。 また、高崎駅では改札の外に出ることはできません。※長野駅に限り北陸新幹線「あさま」号と「かがやき」号を乗り継ぐことができます。 この場合、長野駅で改札の外に出ることはできません。※JR券は施設の最寄駅の往復となります。◆片道3,800円(東京-金沢)で、さらに快適なグリーン車をご利用いただけます。◆[かがやき利用OK!]片道:おとな800円増、こども400円増 北陸新幹線「かがやき」号は全車指定席です。自由席はございません。指定席が確保された場合のみ発売いたします。 往路・復路とも12/29~1/4の乗車は「かがやき」号の割増代金はございません。" |
全部でちゃった(ノω・)
どうもdoc.css("p").first.text
とtextメソッドを使うと、HTML中の改行(<br>
ではなく、キーボードから打ち込んだ改行)を無視して全ての文章を繋げて一つのtextとするみたい。
なので、おとなしくchildren
メソッドでp
の子要素それぞれを見ながら、目的の行を発見したら任意の処理をしてbreak
という方法で乗り越えました。
1 2 3 4 5 6 7 8 9 10 |
doc.css("p").first.children.each do |child| if child.text.include?("出発駅") pp child.text break end end #出力結果 #"※1. 出発駅:土浦・横浜・八王子・千葉/上野・大宮・熊谷・本庄早稲田・高崎" |