Dinámicamente especificando las etiquetas durante el uso de sustituir con sopa en Hermosa

StackOverflow https://stackoverflow.com/questions/891434

  •  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.

¿Fue útil?

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top