Dinámicamente especificando las etiquetas durante el uso de sustituir con sopa en Hermosa
-
23-08-2019 - |
Pregunta
Anteriormente me preguntó esta pregunta y volvió este código de ejemplo BeautifulSoup, que después de algunas consultas a nivel local, decidí ir con.
>>> from BeautifulSoup import BeautifulStoneSoup
>>> html = """
... <config>
... <links>
... <link name="Link1" id="1">
... <encapsulation>
... <mode>ipsec</mode>
... </encapsulation>
... </link>
... <link name="Link2" id="2">
... <encapsulation>
... <mode>udp</mode>
... </encapsulation>
... </link>
... </links>
... </config>
... """
>>> soup = BeautifulStoneSoup(html)
>>> soup.find('link', id=1)
<link name="Link1" id="1">
<encapsulation>
<mode>ipsec</mode>
</encapsulation>
</link>
>>> soup.find('link', id=1).mode.contents[0].replaceWith('whatever')
>>> soup.find('link', id=1)
<link name="Link1" id="1">
<encapsulation>
<mode>whatever</mode>
</encapsulation>
</link>
El único problema con esto es que el ejemplo tiene un valor de etiqueta codificada (en este caso el "modo"), y tengo que ser capaz de especificar cualquier etiqueta dentro de la etiqueta "enlace" especificado. no parece sencilla la sustitución de variables a trabajar.
Solución
Trate getattr(soup.find('link', id=1), sometag)
donde ahora tiene una etiqueta codificada en soup.find('link', id=1).mode
- getattr
es la forma en Python para obtener un atributo cuyo nombre se mantiene como una variable de cadena, después de todo
Otros consejos
No es necesario utilizar getattr
:
sometag = 'mode'
result = soup.find('link', id=1).find(sometag)
print result