2012-08-03 202 views
13

我需要兩個元素中的文本字符串中的文本:解析HTML獲取元素

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

>>> text 
'Martin Elias' 

我怎麼能做到這一點?

+0

的Theres幾種方法來這裏皮膚貓。最終的結果是什麼?你可以做JavaScript或一些服務器端解析。 – 2012-08-03 22:40:22

回答

26

我搜索 「蟒蛇解析HTML」,這是第一個結果: https://docs.python.org/2/library/htmlparser.html

此代碼是從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>') 

這裏採取的是結果:

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 

使用此和通過查看HTMLParser中的代碼,我想出了這個:

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

您可以使用它像這樣:

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 

現在,你應該能夠很容易地從這些名單中提取數據。我希望這有助於!

+0

這是美麗的:) – AsheKetchum 2017-09-14 19:52:07

18

我推薦使用Python Beautiful Soup 4庫。

pip install beautifulsoup4 

它使HTML解析真的很容易。

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

我知道問題是標記爲python-2.x,但我認爲應該指出的是,beautifulsoup只適用於python 2.x. – LJNielsenDk 2012-08-04 09:19:12

+3

美麗的湯4在2.7和3都可以工作。 – 2012-08-04 14:08:10

+0

你從哪裏找到美麗的湯的API文檔? – 2016-02-29 19:15:12

0

您也可以嘗試使用html5lib和XPath,there is a good question about it here,這個問題的答案有一個重要的細節(namespaceHTMLElements)要記住,使html5lib像預期的那樣。我浪費了很多時間試圖讓它工作,因爲我忽略了我需要改變它。

2

安裝beautifulsoup和 你可以這樣做:

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