2012-08-03 16 views
13

ich den Text innerhalb der beiden Elemente in einen String erhalten muß:Parsing HTML erhalten Text innerhalb eines Elements

source_code = """<span class="UserName"><a href="#">Martin Elias</a></span>""" 

>>> text 
'Martin Elias' 

Wie kann ich das erreichen?

+0

Theres mehrere Möglichkeiten, um die Katze hier, um die Haut. Was ist das Endergebnis? Sie könnten JavaScript oder serverseitiges Parsen durchführen. –

Antwort

26

I "Python Parse html" gesucht und dies war das erste Ergebnis: https://docs.python.org/2/library/htmlparser.html

Dieser Code aus der Python-Dokumentation

genommen wird
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>') 

Hier ist das Ergebnis:

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 

Mit diesem und mit Blick auf den Code in HTMLParser kam ich mit dieser:

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 = [] 

Sie können es wie folgt verwenden:

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 

Jetzt sollten Sie in der Lage sein, Ihre Daten aus diesen Listen leicht zu extrahieren. Ich hoffe das hat geholfen!

+0

Das ist schön :) – AsheKetchum

18

Ich empfehle die Verwendung der Python Beautiful Soup 4 Bibliothek.

pip install beautifulsoup4 

Es macht HTML-Analyse wirklich einfach.

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' 
+0

Ich weiß, dass die Frage mit Python-2.x markiert ist, aber ich denke, es sollte beachtet werden, dass beautifulsoup nur auf Python 2.x funktioniert. – LJNielsenDk

+3

Schöne Suppe 4 funktioniert sowohl in 2.7 und 3. –

+0

Wo finden Sie gute API-Dokumentation für schöne Suppe? –

0

Sie können auch versuchen html5lib und XPath, there is a good question about it here, diese Antwort hat ein wichtiges Detail (namespaceHTMLElements) zu erinnern, wie erwartet zu machen html5lib verhalten. Ich habe so viel Zeit verschwendet, um es zum Laufen zu bringen, weil ich übersehen habe, dass ich das ändern musste.

2

installieren beautifulsoup und Sie können wie folgt tun:

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 
Verwandte Themen