Erro ao obter a string entre dois padrões

4

Eu quero pegar uma string entre dois padrões. O padrão é o primeiro ambiente <p> </p> em um arquivo html.

<p>Sorcery, 
          R (1)
          </p>
        <p class="ctext"><b>As an additional cost to cast Goblin Grenade, sacrifice a Goblin.<br><br>Goblin Grenade deals 5 damage to target creature or player.</b></p>


      <p><i>Don't underestimate the aerodynamic qualities of the common goblin.</i></p>
      <p>Illus. Kev Walker</p>

Esse ambiente é o primeiro do arquivo, então descarto tudo combinado até o <p> e desejo excluir tudo depois do </p> .

name="goblin grenade"
wget -O- http://magiccards.info/query?q="$name" | grep -oP '<p>\K[^<]+'

Eu não sei porque não funciona corretamente. Eu recebo

Sorcery, 
Illus. Kev Walker
    
por Arturo 26.12.2014 / 19:46

2 respostas

5

Não analise HTML com regex, em vez disso, use um analisador HTML adequado.

teoria:

De acordo com a teoria de compilação, o HTML não pode ser analisado usando regex com base na máquina de estados finitos . Devido à construção hierárquica do HTML, você precisa usar um autômato de empilhamento e manipular LALR usando ferramentas como YACC .

ferramenta diária realLife © ® ™:

em vez disso, você deve usar uma ferramenta correta para um trabalho correto.

... e é um trabalho para :

por string matching :

string="Sorcery"
xmllint --html --xpath "//p[contains(text(), '$string')]/text()" file_or_URL

pelo enésimo nó <p> onde N é 1 aqui:

xmllint --html --xpath "//p[1]/text()" file_or_URL

Verifique se link

    
por 26.12.2014 / 20:04
0

Aviso:

A resposta @sputnick é claramente o caminho certo a seguir. (Eu amo o xmllint e eu o uso para várias tarefas XML / HTML; obrigado por me ensinar sobre a opção xpath !!)

No entanto, outras técnicas menos robustas também podem ser úteis em scripting descartável ...

Obtendo o primeiro parágrafo com regex (em Perl)

perl -n0e 'm!<p.*?>(.*?)</p>!s   and print $1'

ou se você quiser remover ' \n '

perl -n0e 'm!<p.*?>(.*?)</p>!s   and print $1 =~ s/\n//gr'
    
por 30.12.2014 / 14:34

Tags