Analizar una etiqueta de script con dicts en BeautifulSoup

Trabajando en una respuesta parcial a esta pregunta, me encontré con un elemento bs4.element.Tag que es un lío de listas y dictados nesteds ( s , abajo).

¿Hay alguna forma de devolver una lista de direcciones URL contenidas en s sin usar re.find_all ? Otros comentarios sobre la estructura de esta etiqueta también son útiles.

 from bs4 import BeautifulSoup import requests link = 'https://stackoverflow.com/jobs?med=site-ui&ref=jobs-tab&sort=p' r = requests.get(link) soup = BeautifulSoup(r.text, 'html.parser') s = soup.find('script', type='application/ld+json') ## the first bit of s: # s # Out[116]: #  # {"@context":"http://schema.org","@type":"ItemList","numberOfItems":50, 

Lo que he intentado:

  • Examinar aleatoriamente a través de métodos con tabulación en s .
  • Escoger a través de los documentos .

Mi problema es que s solo tiene 1 atributo ( type ) y no parece tener ninguna etiqueta secundaria.

Puede usar s.text para obtener el contenido del script. Es JSON, así que puedes analizarlo con json.loads . A partir de ahí, es simple acceso al diccionario:

 import json from bs4 import BeautifulSoup import requests link = 'https://stackoverflow.com/jobs?med=site-ui&ref=jobs-tab&sort=p' r = requests.get(link) soup = BeautifulSoup(r.text, 'html.parser') s = soup.find('script', type='application/ld+json') urls = [el['url'] for el in json.loads(s.text)['itemListElement']] print(urls)