Domanda

sto usando pyparsing per analizzare HTML. Sto prendendo tutti i tag embed, ma in alcuni casi c'è un tag a subito dopo che anche io voglio afferrare se è disponibile.

Esempio:

import pyparsing
target = pyparsing.makeHTMLTags("embed")[0]
target.setParseAction(pyparsing.withAttribute(src=pyparsing.withAttribute.ANY_VALUE))
target.ignore(pyparsing.htmlComment)

result = target.searchString(""".....
   <object....><embed>.....</embed></object><br /><a href="blah">blah</a>
   """)

Non sono stato in grado di trovare alcuna compensazione negli oggetti risultato carattere, altrimenti ho potuto solo prendere una fetta della stringa di input originale e lavorare da lì.

EDIT:

Qualcuno ha chiesto il motivo per cui io non uso BeautifulSoup. Questa è una buona domanda, lascia che ti mostri il perché ho scelto di non utilizzarlo con un esempio di codice:

import BeautifulSoup
import urllib
import re
import socket

socket.setdefaulttimeout(3)

# get some random blogs
xml = urllib.urlopen('http://rpc.weblogs.com/shortChanges.xml').read()

success, failure = 0.0, 0.0

for url in re.compile(r'\burl="([^"]+)"').findall(xml)[:30]:
    print url
    try:
        BeautifulSoup.BeautifulSoup(urllib.urlopen(url).read())
    except IOError:
        pass
    except Exception, e:
        print e
        failure += 1
    else:
        success += 1


print failure / (failure + success)

Quando provo questo, BeautifulSoup fallisce con errori di analisi 20-30% del tempo . Questi non sono casi limite rare. pyparsing è lento e farraginoso, ma non ha fatto saltare in aria, non importa quello che buttare a questo. Se posso essere illuminato da un modo migliore per utilizzare BeautifulSoup allora sarei molto interessato a sapere che.

È stato utile?

Soluzione

Se c'è un tag facoltativa <a> che sarebbe stato interessante se segue un tag <embed>, quindi aggiungere al vostro modello di ricerca:

embedTag = pyparsing.makeHTMLTags("embed")[0]
aTag = pyparsing.makeHTMLTags("a")[0]
target = embedTag + pyparsing.Optional(aTag)
result = target.searchString(""".....   
    <object....><embed>.....</embed></object><br /><a href="blah">blah</a>
    """)

print result.dump()

Se si desidera acquisire la posizione del carattere di un'espressione all'interno del vostro parser, inserire uno di questi, con un nome di risultati:

loc = pyparsing.Empty().setParseAction(lambda s,locn,toks: locn)
target = loc("beforeEmbed") + embedTag + loc("afterEmbed") + 
                                                 pyparsing.Optional(aTag)

Altri suggerimenti

Perché dovresti scrivere il proprio parser HTML? La libreria standard comprende HTMLParser , e BeautifulSoup grado di gestire qualsiasi HTMLParser lavoro non può.

non si preferisce con una normale espressione regolare? o perché la sua cattiva abitudine di analizzare HTML? : D

re.findall("<object.*?</object>(?:<br /><a.*?</a>)?",a)

Sono stato in grado di eseguire il codice BeautifulSoup e ricevuto nessun errore. Io corro BeautifulSoup 3.0.7a

Si prega di utilizzare BeautifulSoup 3.0.7a; 3.1.0.1 ha bug che impediscono di lavorare a tutti, in alcuni casi (come la vostra).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top