Pyparsing es un buen paso intermedio entre BeautifulSoup y regex. Es más robusto que solo expresiones regulares, ya que su análisis de etiquetas HTML comprende variaciones en el caso, el espacio en blanco, la presencia/ausencia/orden de atributos, pero es más simple hacer este tipo de extracción de etiqueta básica que usar BS.
Su ejemplo es especialmente simple, ya que todo lo que está buscando se encuentra en los atributos de la etiqueta de "entrada" de apertura. Aquí es un ejemplo pyparsing mostrando varias variaciones en su etiqueta de entrada que daría a los ataques expresiones regulares, y también muestra cómo no coincide con una etiqueta si está dentro de un comentario:
html = """<html><body>
<input type="hidden" name="fooId" value="**[id is here]**" />
<blah>
<input name="fooId" type="hidden" value="**[id is here too]**" />
<input NAME="fooId" type="hidden" value="**[id is HERE too]**" />
<INPUT NAME="fooId" type="hidden" value="**[and id is even here TOO]**" />
<!--
<input type="hidden" name="fooId" value="**[don't report this id]**" />
-->
<foo>
</body></html>"""
from pyparsing import makeHTMLTags, withAttribute, htmlComment
# use makeHTMLTags to create tag expression - makeHTMLTags returns expressions for
# opening and closing tags, we're only interested in the opening tag
inputTag = makeHTMLTags("input")[0]
# only want input tags with special attributes
inputTag.setParseAction(withAttribute(type="hidden", name="fooId"))
# don't report tags that are commented out
inputTag.ignore(htmlComment)
# use searchString to skip through the input
foundTags = inputTag.searchString(html)
# dump out first result to show all returned tags and attributes
print foundTags[0].dump()
print
# print out the value attribute for all matched tags
for inpTag in foundTags:
print inpTag.value
Lienzo:
['input', ['type', 'hidden'], ['name', 'fooId'], ['value', '**[id is here]**'], True]
- empty: True
- name: fooId
- startInput: ['input', ['type', 'hidden'], ['name', 'fooId'], ['value', '**[id is here]**'], True]
- empty: True
- name: fooId
- type: hidden
- value: **[id is here]**
- type: hidden
- value: **[id is here]**
**[id is here]**
**[id is here too]**
**[id is HERE too]**
**[and id is even here TOO]**
Puede ver que el pyparsing no solo coincide con estas variaciones impredecibles, sino que también devuelve los datos en un objeto que facilita la lectura de los atributos de etiqueta individuales y sus valores.
Creo que la palabra clave "nueva" no coincide. –