Extrai texto do site do código-fonte

1

Eu preciso extrair texto com um script bash de um site em HTML, usei esta solução mas não funciona bem para mim, porque devo editar e formatar o texto de saída. Eu preciso do texto entre a tag:

<p><p tabindex="0">

Exemplo eu sou surf em https://apps.ubuntu.com/cat/applications/clementine/ No Firefox exibiu a próxima tag no seu código-fonte:

<p><p tabindex="0">Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.</p><p tabindex="0">Summary of included features :</p><ul><li>Search and play your local music library.</li><li>Listen to internet radio from Last.fm, SomaFM and Magnatune.</li><li>Tabbed playlists, import and export M3U, XSPF, PLS and ASX.</li><li>Visualisations from projectM.</li><li>Transcode music into MP3, Ogg Vorbis, Ogg Speex, FLAC or AAC</li><li>Edit tags on MP3 and OGG files, organise your music.</li><li>Download missing album cover art from Last.fm.</li><li>Native desktop notifications using libnotify.</li><li>Supports MPRIS, or remote control using the command-line.</li><li>Remote control using a Wii Remote, MPRIS or the command-line.</li><li>Copy music to your iPod, iPhone, MTP or mass-storage USB player.</li><li>Queue manager. It is largely a port of Amarok 1.4, with some features rewritten to take advantage of Qt4.</li></ul></p>

Como extrair o texto acima, depois de <p><p tabindex="0"> ? lembre-se é apenas um exemplo, o site e tag poderia mudar.

Output='Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.'

graças a $ John1024 sua solução funciona bem com o site ubuntu, mas com o opensuse não é exibido corretamente. esta é a variável com o site do OpenSuse:

output="$(wget -q http://software.opensuse.org/package/clementine -O - | sed -n 's/.*<p id="pkg-desc">\([^<]*\).*//p')" .

echo $ output

Clementine is a modern music player and library organiser. Clementine is a (não exibe o texto completo)

Eu também tentei:

output="$(wget -q http://software.opensuse.org/package/clementine/ -O - | sed -ne '/<p id="pkg-desc">/, /[.</p>]$/p')"

echo $ output

<p id="pkg-desc">Clementine is a modern music player and library organiser. Clementine is a port of Amarok 1.4, with some features rewritten to take advantage of Qt4. (it displays with '<p id="pkg-desc">')

    
por davidva 16.03.2014 / 04:01

1 resposta

2

Em geral, deve-se usar uma ferramenta que entenda html. Para fins limitados, porém, um comando simples pode ser suficiente. Nesse caso, sed é suficiente para fazer o que você pergunta e funciona bem em bash scripts. Se você capturou o html de origem em index.html , então:

$ sed -n 's/.*<p><p tabindex="0">\([^<]*\).*//p' index.html 
Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.

Ou para capturar o HTML e processar tudo em uma etapa:

$ wget -q https://apps.ubuntu.com/cat/applications/clementine/ -O - | sed -n 's/.*<p><p tabindex="0">\([^<]*\).*//p' 
Clementine is a multiplatform music player focusing on a fast and easy-to-use interface for searching and playing your music.

Para capturar essa saída para uma variável bash :

output="$(wget -q https://apps.ubuntu.com/cat/applications/clementine/ -O - | sed -n 's/.*<p><p tabindex="0">\([^<]*\).*//p')"

A opção -n é usada em sed . Isso diz para não imprimir a saída, a menos que nós explicitamente perguntemos. sed passa pela linha de entrada por linha procurando uma linha que corresponda a .*<p><p tabindex="0">\([^<]*\).* . Todo o texto que segue o <p tabindex="0"> e a próxima tag é capturado na variável 1. Tudo nessa linha é então substituído pelo texto capturado que é então impresso.

    
por 16.03.2014 / 04:43

Tags