Como foi mencionado regex não é bom para analisar html . Semelhante a outra resposta de análise , você pode criar um verso em Ruby como o seguinte para fazer isso por você. Note que é necessário Nokogiri que você pode instalar como 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
Ele lê o arquivo fornecido, neste caso, sample.html, obtém todos os elementos tr
e, para cada elemento, imprime o conteúdo dos três primeiros elementos td
.
Para sua amostra, será exibida:
1988 Mandela, NelsonNelson Mandela South Africa 1988 Marchenko, AnatolyAnatoly Marchenko (posthumously) Soviet Union
O problema são as linhas que contêm os nomes duas vezes, por ex. (formatado para ser mais fácil de ler)
<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>
em que o nome é o primeiro em span
com style="display:none;"
e depois novamente em outro span
. Não sei como extrair apenas o nome que não está dentro de um elemento com style="display:none;
. (Encontrei o link e link , mas eles não descrevem a técnica certa. Talvez alguém consiga criar uma correção por meio do link ?)