2012-01-09 98 views
0

標籤這是我的HTML樹如何分割從HTML樹

<li class="taf"><h3><a href="26eOfferCode%3DGSONESTP-----------" id="pa1"> 
    Citibank <b>Credit Card</b> - Save over 5% on fuel | Citibank.co.in</a> 
    </h3>Get the IndianOil Citibank <b>Card</b>. Apply Now! 
    <br /> 
    <a href="e%253DGOOGLE ------">Get 10X Rewards On Shopping</a> - 
    <a href="S%2526eOfferCode%253DGSCCSLEX ------">Save Over 5% On Fuel</a> 
    <br /> 
    <cite>www.citibank.co.in/<b>CreditCards</b></cite> 
</li> 

從這個網站,我需要提取beforeth的< BR>標籤

線路1線:獲得印度石油公司花旗銀行卡。現在申請!

線路2:獲取10X獎勵安商場 - 節省超過5%的燃油

它是如何應該在Python呢?

+0

如果這不是唯一的情況,你需要做更多這樣的東西,看看一些(x)的HTML解析庫。例如[美麗的湯](http://www.crummy.com/software/BeautifulSoup/)或[lxml](http://lxml.de/)。在標準庫中,有[minidom](http://docs.python.org/library/xml.dom.minidom.html),但我不喜歡它,它可能不會在錯誤的語法(你在現實世界中會發現很多)。 – rplnt 2012-01-09 12:28:28

回答

4

我覺得你剛纔問的每個<br/>前行。

這下面的代碼將做到這一點對您所提供的樣品,通過條帶化出<b><a>標籤和打印每個元素,其following-sibling<br/>.tail

from lxml import etree 

doc = etree.HTML(""" 
<li class="taf"><h3><a href="26eOfferCode%3DGSONESTP-----------" id="pa1"> 
    Citibank <b>Credit Card</b> - Save over 5% on fuel | Citibank.co.in</a> 
    </h3>Get the IndianOil Citibank <b>Card</b>. Apply Now! 
    <br /> 
    <a href="e%253DGOOGLE ------">Get 10X Rewards On Shopping</a> - 
    <a href="S%2526eOfferCode%253DGSCCSLEX ------">Save Over 5% On Fuel</a> 
    <br /> 
    <cite>www.citibank.co.in/<b>CreditCards</b></cite> 
</li>""") 

etree.strip_tags(doc,'a','b') 

for element in doc.xpath('//*[following-sibling::*[name()="br"]]'): 
    print repr(element.tail.strip()) 

產量:

'Get the IndianOil Citibank Card. Apply Now!' 
'Get 10X Rewards On Shopping -\n Save Over 5% On Fuel' 
+1

'doc。xpath('// * [following-sibling :: br]')'也會工作(沒有'name()=「br」')。 – reclosedev 2012-01-09 12:48:06

+0

我同意這個表達。大多數情況下,我都是爲了上述表達方式:「」獲取印度石油公司的花旗銀行卡。現在申請!無 - 無「」 – Nava 2012-01-09 14:04:38

0

我不知道你是否想用lxml或美麗的湯。但對於使用XPath這裏lxml的是一個例子

import lxml 
from lxml import etree 
import urllib2 

response = urllib2.urlopen('your url here') 
html = response.read() 
imdb = etree.HTML(html) 
titles = imdb.xpath('/html/body/li/a/text()')//xpath for "line 2" data.[use firebug] 

我使用的xpath是您給定的HTML代碼段。它可能會在原始上下文中發生變化。

您也可以試試cssselect in lxml

import lxml.html 
import urllib 
data = urllib.urlopen('your url').read() 
doc = lxml.html.fromstring(data) 
elements = doc.cssselect('your csspath here') // CSSpath[using firebug extension] 
for element in elements: 
     print element.text_content() 
1

解決方案,而中繼上<br>標籤:

import lxml.html 

html = "..." 
tree = lxml.html.fromstring(html) 
line1 = ''.join(tree.xpath('//li[@class="taf"]/text() | b/text()')[:3]).strip() 
line2 = ' - '.join(tree.xpath('//li[@class="taf"]//a[not(@id)]/text()')) 
1

與HTML的解析所有你需要做對HTML格式的一些假設。如果我們可以假設,前行是<br>標籤高達塊級別標記,或其他<br>之前,一切都那麼我們可以做以下...

from BeautifulSoup import BeautifulSoup 

doc = """ 
    <li class="taf"><h3><a href="26eOfferCode%3DGSONESTP-----------" id="pa1"> 
    Citibank <b>Credit Card</b> - Save over 5% on fuel | Citibank.co.in</a> 
    </h3>Get the IndianOil Citibank <b>Card</b>. Apply Now! 
    <br /> 
    <a href="e%253DGOOGLE ------">Get 10X Rewards On Shopping</a> - 
    <a href="S%2526eOfferCode%253DGSCCSLEX ------">Save Over 5% On Fuel</a> 
    <br /> 
    <cite>www.citibank.co.in/<b>CreditCards</b></cite> 
</li> 
""" 

soup = BeautifulSoup(doc) 

現在我們已經解析的HTML,接下來我們定義我們不想將這些標籤列爲行的一部分。還有其他的塊標籤,但是這是爲這個HTML做的。通過每個<br>標籤通過它的兄弟姐妹退一步,直到我們要麼沒有更多的,還是我們打塊級別標記

block_tags = ["div", "p", "h1", "h2", "h3", "h4", "h5", "h6", "br"] 

我們循環。每次我們循環時,我們都會將節點添加到我們行的前面。 NavigableStrings沒有name屬性,但我們希望包含它們,因此在while循環中進行了兩部分測試。

for node in soup.findAll("br"): 
    line = "" 
    sibling = node.previousSibling 
    while sibling is not None and (not hasattr(sibling, "name") or sibling.name not in block_tags): 
     line = unicode(sibling) + line 
     sibling = sibling.previousSibling 
    print line