一致を使用して HTML ドキュメントの一部を抽出する Ruby の正規表現ヘルプ
概要
次の形式の HTML ドキュメントがあります。
<tr><td colspan="4"><span class="fullName">Bill Gussio</span></td></tr>
<tr>
<td class="sectionHeader">Contact</td>
<td class="sectionHeader">Phone</td>
<td class="sectionHeader">Home</td>
<td class="sectionHeader">Work</td>
</tr>
<tr valign="top">
<td class="sectionContent"><span>Screen Name:</span> <span>bhjiggy</span><br><span>Email 1:</span> <span>[email protected]</span></td>
<td class="sectionContent"><span>Mobile: </span><span>2404173223</span></td>
<td class="sectionContent"><span>NY</span><br><span>New York</span><br><span>78642</span></td>
<td class="sectionContent"><span>MD</span><br><span>Owings Mills</span><br><span>21093</span></td>
</tr>
<tr><td colspan="4"><hr class="contactSeparator"></td></tr>
<tr><td colspan="4"><span class="fullName">Eddie Osefo</span></td></tr>
<tr>
<td class="sectionHeader">Contact</td>
<td class="sectionHeader">Phone</td>
<td class="sectionHeader">Home</td>
<td class="sectionHeader">Work</td>
</tr>
<tr valign="top">
<td class="sectionContent"><span>Screen Name:</span> <span>eddieOS</span><br><span>Email 1:</span> <span>[email protected]</span></td>
<td class="sectionContent"></td>
<td class="sectionContent"><span></span></td>
<td class="sectionContent"><span></span></td>
</tr>
<tr><td colspan="4"><hr class="contactSeparator"></td></tr>
したがって、連絡先情報の塊と「連絡先の区切り文字」が交互に表示されます。連絡先情報を取得したいので、最初の障害は連絡先セパレーター間のチャンクを取得することです。 Rubularを使用した正規表現はすでに理解しています。それは次のとおりです。
/<tr><td colspan="4"><span class="fullName">((.|\s)*?)<hr class="contactSeparator">/
Rubular をチェックして、チャンクが分離されていることを確認できます。
しかし、私の大きな問題は、Ruby コードで問題が発生していることです。組み込みの match 関数を使用してプリントを作成しましたが、期待した結果が得られません。コードは次のとおりです。
page = agent.get uri.to_s
chunks = page.body.match(/<tr><td colspan="4"><span class="fullName">((.|\s)*?)<hr class="contactSeparator">/).captures
chunks.each do |chunk|
puts "new chunk: " + chunk.inspect
end
page.body は、Mechanize によって取得された HTML ドキュメントの本体にすぎないことに注意してください。 HTML ドキュメントははるかに大きくなりますが、この形式になっています。したがって、予期しない出力は以下のようになります。
new chunk: "Bill Gussio</span></td></tr>\r\n\t<tr>\r\n\t\t<td class=\"sectionHeader\">Contact</td>\r\n\t\t<td class=\"sectionHeader\">Phone</td>\r\n\t\t<td class=\"sectionHeader\">Home</td>\r\n\t\t<td class=\"sectionHeader\">Work</td>\r\n\t</tr>\r\n\t<tr valign=\"top\">\r\n\t\t<td class=\"sectionContent\"><span>Screen Name:</span> <span>bhjiggy</span><br><span>Email 1:</span> <span>[email protected]</span></td>\r\n\t\t<td class=\"sectionContent\"><span>Mobile: </span><span>2404173223</span></td>\r\n\t\t<td class=\"sectionContent\"><span>NY</span><br><span>New York</span><br><span>78642</span></td>\r\n\t\t<td class=\"sectionContent\"><span>MD</span><br><span>Owings Mills</span><br><span>21093</span></td>\r\n\t</tr>\r\n\t\r\n\t<tr><td colspan=\"4\">"
new chunk: ">"
ここで私にとって驚きが2つあります。
ここの問題を誰かが見ることができますか?
あるいは、無料の AOL 連絡先輸入業者を誰かが知っていれば、それは素晴らしいことです。 Blackbook を使用していますが、AOL では失敗し続けるため、修正しようとしています。残念ながら、AOL にはまだ連絡先 API がありません。
解決策
「正規表現を使用して XML と HTML を解析するのが難しい理由の例をいくつか挙げていただけますか?」を参照してください。 なぜこれが悪い考えなのか。代わりに HTML パーサーを使用してください。