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