scraping read parser online htmlparser python html python-2.x html-parser

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.