grep、sed、awkを使用してhtmlをフィルタリングしようとしています。

grep、sed、awkを使用してhtmlをフィルタリングしようとしています。

私はcygwinのインストールでLinuxツールの使い方を教えようとしています。私はシェルスクリプトの基礎を自分で教え、同時に個人教育も履修するためのプロジェクトを作ることにしました。私の最初のプロジェクトは、各勝者のためのHTMLページを保存することでした。サハロフ賞フォルダに配置し、すべてのHTMLテキストファイルを処理し、名前、年、誕生と死亡、出身国をハイフン形式で返すスクリプトを作成します。日付形式(1918年7月18日 vs. 1938年1月23日)に一部の矛盾があり、死亡日なしで死んだ人と生きている人を処理できないため、コンピュータに国を認識する方法を教えることも不可能です。 。手動でリストを作成せずに名前を入力することは、デフォルトでこのプロジェクトを放棄した状態です。

これで、HTMLテーブルから各受信者の年、名前、出身国を返そうとします。サハロフ賞ウィキペディアページ。

したがって、次のサンプルHTMLが与えられました。

<tr>
<td>1988</td>
<td><span style="display:none;">Mandela, Nelson</span><span class="vcard"><span class="fn"><a href="/wiki/Nelson_Mandela" title="Nelson Mandela">Nelson Mandela</a></span></span></td>
<td><a href="/wiki/South_Africa" title="South Africa">South Africa</a></td>
<td>Anti-apartheid activist and later President of South Africa</td>
<td><sup id="cite_ref-twentyyears_5-0" class="reference"><a href="#cite_note-twentyyears-5"><span>[</span>5<span>]</span></a></sup></td>
</tr>
<tr>
<td>1988</td>
<td><span style="display:none;">Marchenko, Anatoly</span><span class="vcard"><span class="fn"><a href="/wiki/Anatoly_Marchenko" title="Anatoly Marchenko">Anatoly Marchenko</a></span></span> (posthumously)</td>
<td><a href="/wiki/Soviet_Union" title="Soviet Union">Soviet Union</a></td>
<td>Soviet dissident, author and humans rights activist</td>
<td><sup id="cite_ref-twentyyears_5-1" class="reference"><a href="#cite_note-twentyyears-5"><span>[</span>5<span>]</span></a></sup></td>
</tr>

各受信者の年、名前、出身国のみを返す最良の方法は何ですか?今、私は/<*>/と一致しないすべてを返すawkスクリプトを書くことを考えていますが、それは私が望むものではありません。名前、年、国を具体的に選択する方法についてアドバイスやアイデアを与えることができる人はいますか?それとも、私が自分で解決できる問題よりも優れており、管理しやすい本は少なくともありますか?いつも始めてみると、このすべてがとんでもなく聞こえましたね…。

ベストアンサー1

すでに述べたように正規表現は HTML の解析には適していません。。他に似ている回答分析これを行うには、次のようなRubyステートメントを作成できます。必要であることを参考にしてくださいノコチェgem()としてインストールできますsudo gem install nokogiri

ruby -rnokogiri -e 'Nokogiri::HTML(readlines.join).css("tr").each { |tr| tr.xpath(".//td").take(3).each { |td| puts td.content } }' sample.html

指定されたファイル(この場合はサンプル.html)を読み取り、すべてのtr要素をインポートしてから、各td要素の最初の3つの要素の内容を印刷します。

あなたの例では、次のように出力されます。

1988年
ネルソンマンデラネルソンマンデラ
南アフリカ
1988年
アナトリ・マルチェンコ アナトリ・マルチェンコ(事後)
ソ連

問題は、名前が2回含まれる行です。たとえば(読みやすくフォーマットされています)

<td>
  <span style="display:none;">Mandela, Nelson</span>
  <span class="vcard"><span class="fn">
      <a href="/wiki/Nelson_Mandela" title="Nelson Mandela">Nelson Mandela</a>
    </span>
  </span>
</td>

ここで名前はspanwithで最初に表示され、もう1つはstyle="display:none;"再び表示されますspan。要素内にない名前だけを抽出する方法がわかりませんstyle="display:none;。 (私は見つけたhttps://stackoverflow.com/q/6096327/789593そしてhttps://stackoverflow.com/q/11602077/789593しかし、彼らは正しいスキルを説明しません。たぶん誰かが解決策を提案するかもしれません。http://nokogiri.org/Nokogiri/XML/Node.html? )

おすすめ記事