read - python html scraping
AnĂ¡lisis HTML para obtener texto dentro de un elemento (4)
Necesito obtener el texto dentro de los dos elementos en una cadena:
source_code = """<span class="UserName"><a href="#">Martin Elias</a></span>"""
>>> text
''Martin Elias''
¿Cómo podría lograr esto?
Busqué en "python parse html" y este fue el primer resultado: https://docs.python.org/2/library/htmlparser.html
Este código está tomado de los documentos de Python
from HTMLParser import HTMLParser
# create a subclass and override the handler methods
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
print "Encountered a start tag:", tag
def handle_endtag(self, tag):
print "Encountered an end tag :", tag
def handle_data(self, data):
print "Encountered some data :", data
# instantiate the parser and fed it some HTML
parser = MyHTMLParser()
parser.feed(''<html><head><title>Test</title></head>''
''<body><h1>Parse me!</h1></body></html>'')
Aquí está el resultado:
Encountered a start tag: html
Encountered a start tag: head
Encountered a start tag: title
Encountered some data : Test
Encountered an end tag : title
Encountered an end tag : head
Encountered a start tag: body
Encountered a start tag: h1
Encountered some data : Parse me!
Encountered an end tag : h1
Encountered an end tag : body
Encountered an end tag : html
Usando esto y mirando el código en HTMLParser se me ocurrió esto:
class myhtmlparser(HTMLParser):
def __init__(self):
self.reset()
self.NEWTAGS = []
self.NEWATTRS = []
self.HTMLDATA = []
def handle_starttag(self, tag, attrs):
self.NEWTAGS.append(tag)
self.NEWATTRS.append(attrs)
def handle_data(self, data):
self.HTMLDATA.append(data)
def clean(self):
self.NEWTAGS = []
self.NEWATTRS = []
self.HTMLDATA = []
Puedes usarlo así:
from HTMLParser import HTMLParser
pstring = source_code = """<span class="UserName"><a href="#">Martin Elias</a></span>"""
class myhtmlparser(HTMLParser):
def __init__(self):
self.reset()
self.NEWTAGS = []
self.NEWATTRS = []
self.HTMLDATA = []
def handle_starttag(self, tag, attrs):
self.NEWTAGS.append(tag)
self.NEWATTRS.append(attrs)
def handle_data(self, data):
self.HTMLDATA.append(data)
def clean(self):
self.NEWTAGS = []
self.NEWATTRS = []
self.HTMLDATA = []
parser = myhtmlparser()
parser.feed(pstring)
# Extract data from parser
tags = parser.NEWTAGS
attrs = parser.NEWATTRS
data = parser.HTMLDATA
# Clean the parser
parser.clean()
# Print out our data
print tags
print attrs
print data
Ahora debería poder extraer fácilmente sus datos de esas listas. Espero que esto haya ayudado!
Instala beautifulsoup y puedes hacer esto:
from BeautifulSoup import BeautifulSoup
source_code = ''"""<span class="UserName"><a href="#">Martin Elias</a></span>"""''
soup = BeautifulSoup(source_code)
print soup.find(''span'',{''class'':''UserName''}).text
Recomiendo usar la biblioteca Python Beautiful Soup 4 .
pip install beautifulsoup4
Hace que el análisis de HTML sea muy fácil.
from bs4 import BeautifulSoup
source_code = """<span class="UserName"><a href="#">Martin Elias</a></span>"""
soup = BeautifulSoup(source_code)
print soup.a.string
>>> ''Martin Elias''
También puede intentar usar html5lib y XPath, hay una buena pregunta al respecto aquí , esa respuesta tiene un detalle importante ( namespaceHTMLElements
HTMLElements) para recordar hacer que html5lib se comporte como se espera. Perdí tanto tiempo intentando que funcionara porque pasé por alto que necesitaba cambiar eso.