Extrai várias linhas de linha do arquivo HTML usando tags específicas

1

Eu preciso extrair a string que está começando com a tag <span class="style530"> e terminar com </span> tag.

Eu usei o comando sed, mas não obtive o resultado desejado. Abaixo está o código de amostra:

<strong>
-
<span class="style530">
AA - 
This
is my
First
Heading</span></strong><br>
<span class="style530">
<strong>
*Some
text,*
<strong>
*text*</strong>, 
*text*
<strong>
*text*</strong>: 
<br>
<span class="style530">
<strong>
- This 
is my
Second Heading</strong></span><br>
<span class="style530">
<strong>
*Some
text,*
<strong>
*text*</strong>, 
*Here
is some
text.*
<strong>*text*</strong>: 
*Here is 
some
text*.<br>
<br>
<strong>
-
<span class="style530">
- This is
my Third
Heading</span></strong><br>

A saída deve ser como:

 AA - This is my First Heading
 - This is my Second Heading
 - This is my Third Heading

Obrigado!

    
por user66895 05.05.2014 / 16:00

3 respostas

2

O Regex não é realmente capaz de analisar html completamente.

Existe uma ferramenta de linha de comando chamada xidel que permite usar seletores XPath ou CSS para extrair os bits desejados .

Algo assim atenderia ao seu requisito declarado:

./xidel test.html --extract '//span[@class="style530"]' --output-format bash

Mas observe que isso retorna mais do que a saída exigida, pois você tem um <span class="style530"> não divulgado

    
por 05.05.2014 / 16:48
1

Use o HTMLParser para essas ações:

#!/usr/bin/python
# vim: set fileencoding=utf8 :
# (c) fazie

from HTMLParser import HTMLParser
import re
import sys

class MyParser(HTMLParser):
    inside_span = False

    def __init__(self,file):
        HTMLParser.__init__(self)
        f = open(file)
        self.feed(f.read())

    def handle_starttag(self,tag,attrs):
        if tag == 'span':
            for name,value in attrs:
                if name=='class' and value=='style530':
                    self.inside_span=True

    def handle_data(self,data):
        data = data.strip(' \t\r\n')
        if data != "":
            if self.inside_span:
                data = re.sub('\n',' ',data)
                data = re.sub('\s\s+',' ',data)
                print data

    def handle_endtag(self,tag):
        if tag == 'span':
            self.inside_span=False

MyParser(sys.argv[1])

Execute:

python myparser.py inputfile.html
    
por 05.05.2014 / 16:52
0

Você pode tentar algo como abaixo.

awk -vRS='<' '
  inside || /^span[^>]*class="style530"/ {
    inside = 1
    if (/^span/)
      n++
    else if (/^\/span>/ && !--n) {
      $0="/span>\n"
      inside=0
    }
    printf "<%s", $0
  }' file.html | sed '/^</ d' | grep -v ">$"

No entanto, não é aconselhável extrair usando cabeçalhos HTML. Consulte aqui por que motivo não deve analisar páginas HTML. Eu sugiro que você use curl e w3m para remover os cabeçalhos HTML após o qual a análise se tornará pouco mais simples.

    
por 05.05.2014 / 16:42

Tags