2013-06-19 28 views
4

之間提取文本假設我有這樣的事情:有效的方式,從標籤

var = '<li> <a href="/...html">Energy</a> 
     <ul> 
     <li> <a href="/...html">Coal</a> </li> 
     <li> <a href="/...html">Oil </a> </li> 
     <li> <a href="/...html">Carbon</a> </li> 
     <li> <a href="/...html">Oxygen</a> </li' 

什麼是最好的(最有效)的方式來提取標籤之間的文本?我應該使用正則表達式嗎?我目前的技術依賴於分割li標籤上的字符串,並使用for循環,只是想知道是否有更快的方法來做到這一點。

+0

這是不是正確的html?最後一個'li'標籤沒有關閉,你忘記了第一個標籤中的結束標籤,並且明智的是沒有關閉標籤'ul'這是有目的的嗎? –

+2

「最好」和「最有效」都是非常含糊的詞... – Sinkingpoint

回答

2

您可以使用Beautiful Soup這是這樣的任務非常好。這是非常簡單,易於安裝和大量的文檔。

你的例子有一些li標籤沒有關閉。我已經做了改正,這是怎麼會是讓所有的李標籤

from bs4 import BeautifulSoup 

var = '''<li> <a href="/...html">Energy</a></li> 
    <ul> 
    <li><a href="/...html">Coal</a></li> 
    <li><a href="/...html">Oil </a></li> 
    <li><a href="/...html">Carbon</a></li> 
    <li><a href="/...html">Oxygen</a></li>''' 

soup = BeautifulSoup(var) 

for a in soup.find_all('a'): 
    print a.string 

它會打印:

能源
COA



For documentation and mo重新例子參見BeautifulSoup doc

+0

我認爲'a.findAll(text = True)'會更快。 –

6

從標記語言中提取信息的推薦方法是使用解析器,例如Beautiful Soup是一個不錯的選擇。 Avoid using regular expressions爲此,它不是適合工作的正確工具!

+1

+1 BeautifulSoup是工作的工具,而不是正則表達式。 –

+0

因此,可能在'var.findall(text = True)'的行上? –

2

,如果你想要去的正則表達式的路由(其中一些人認爲是解析HTML/XML罪),你可以嘗試這樣的事:

re.findall('(?<=>)([^<]+)(?=</a>[^<]*</li)', var, re.S) 

我個人認爲,正則表達式是罰款一 - 關閉或簡單的使用情況,但是在編寫正則表達式時需要非常小心,以避免創建出人意料的貪婪模式。對於複雜的文檔解析,總是最好使用像BeautifulSoup這樣的模塊。

2

如果您只是在解析了標記內部的內容後才嘗試使用xpath例如

for text in var.xpath_all(".//ul/li"): 
    text = li.xpath('.//a/text()') 
    print text 

您還可以使用的urllib,BeautifulSoup等