scraping pagina leer examples español python beautifulsoup urllib2

pagina - web scraping python español



Extraer texto de la etiqueta de script usando BeautifulSoup en Python (2)

¿Podrías ayudarme con esta pequeña cosa? Estoy buscando extraer el correo electrónico, el teléfono y el valor del nombre del código siguiente en la etiqueta SCRIPT (no en Body) usando Beautiful soup (Python). Soy nuevo en Python y blog recomienda utilizar sopa hermosa para extraer.

Intenté obtener la página usando el siguiente código:

fileDetails = BeautifulSoup(urllib2.urlopen(''http://www.example.com'').read()) results = fileDetails.find(email:")

Este código de solicitud de Ajax no se repite en la página nuevamente. ¿Podemos escribir también try y catch para que si no lo encuentra en la página no arroje ningún error?

<script type="text/javascript" language=''javascript''> $(document).ready( function (){ $(''#message'').click(function(){ alert(); }); $(''#addmessage'').click(function(){ $.ajax({ type: "POST", url: ''http://www.example.com'', data: { email: ''[email protected]'', phone: ''9999999999'', name: ''XYZ'' } }); }); });

Una vez que obtengo esto, también quiero almacenar en un archivo de Excel.

Gracias de antemano.


Alternativamente al enfoque basado en slimit , puede analizar el código javascript utilizando el módulo slimit , que construye un Árbol de sintaxis abstracto y le ofrece una forma de obtener todas las asignaciones y ponerlas en el diccionario:

from bs4 import BeautifulSoup from slimit import ast from slimit.parser import Parser from slimit.visitors import nodevisitor data = """ <html> <head> <title>My Sample Page</title> <script> $.ajax({ type: "POST", url: ''http://www.example.com'', data: { email: ''[email protected]'', phone: ''9999999999'', name: ''XYZ'' } }); </script> </head> <body> <h1>What a wonderful world</h1> </body> </html> """ # get the script tag contents from the html soup = BeautifulSoup(data) script = soup.find(''script'') # parse js parser = Parser() tree = parser.parse(script.text) fields = {getattr(node.left, ''value'', ''''): getattr(node.right, ''value'', '''') for node in nodevisitor.visit(tree) if isinstance(node, ast.Assign)} print fields

Huellas dactilares:

{u''name'': u"''XYZ''", u''url'': u"''http://www.example.com''", u''type'': u''"POST"'', u''phone'': u"''9999999999''", u''data'': '''', u''email'': u"''[email protected]''"}

Entre otros campos, hay email , name y phone que le interesan.

Espero que ayude.


Puede obtener los contenidos de la etiqueta de script través de BeautifulSoup y luego aplicar una expresión regular para obtener los datos deseados.

Ejemplo de trabajo (basado en lo que describiste en la pregunta):

import re from bs4 import BeautifulSoup data = """ <html> <head> <title>My Sample Page</title> <script> $.ajax({ type: "POST", url: ''http://www.example.com'', data: { email: ''[email protected]'', phone: ''9999999999'', name: ''XYZ'' } }); </script> </head> <body> <h1>What a wonderful world</h1> </body> </html> """ soup = BeautifulSoup(data) script = soup.find(''script'') pattern = re.compile("(/w+): ''(.*?)''") fields = dict(re.findall(pattern, script.text)) print fields[''email''], fields[''phone''], fields[''name'']

Huellas dactilares:

[email protected] 9999999999 XYZ

Realmente no me gusta la solución, ya que ese enfoque regex es realmente frágil. Todo tipo de cosas pueden suceder que lo rompan. Sigo pensando que hay una solución mejor y nos falta una imagen más grande aquí. Proporcionar un enlace a ese sitio específico sería de gran ayuda, pero es lo que es.

UPD (arreglando el código OP proporcionado):

soup = BeautifulSoup(data, ''html.parser'') script = soup.html.find_next_sibling(''script'', text=re.compile(r"/$/(document/)/.ready")) pattern = re.compile("(/w+): ''(.*?)''") fields = dict(re.findall(pattern, script.text)) print fields[''email''], fields[''phone''], fields[''name'']

huellas dactilares:

[email protected] 9999999999 Shamita Shetty