2012-02-27 21 views
1

レッツは、私がこのようなコードを持って言う:Xpath(lxml)を使って複数のタグからテキストを抽出する方法は?

<table> 
    <tr> 
    <td colspan=2>Date</td> 
    </tr> 
    <tr id='something'> 
    <td>8 september</td> 
    <td>2008</td> 
    </tr> 
</table> 

私は、「2008年9月8日を」持っている日付を抽出したいです。

+0

http://stackoverflow.com/a/1405439/181772 [予選子ノードの値の文字列連結を返すためのXPath]の –

+0

可能重複します(http:// stackoverflowの.com/questions/1403971/xpath-return-string-concatenation-of-child-node-values) –

答えて

2

純粋なXPath 1.0ソリューションです。

用途:

string(normalize-space(//table/tr[@id = 'something'])) 
+0

素晴らしいです。 " ..." 30xの場合、30xの文字列を取得する方法は? – acheruns

+1

@acheruns:このノードが30回ある場合、XPath 1.0だけでは、必要な文字列をすべて取得することはできません。別のインデックスを使用するたびに、ループ内で(1からcount(expression)まで)XPath式を30回評価する必要があります。 '$ k'は1から' count( '')に代入されなければなりません。 // table/tr [@id = 'something']) ' –

0

あなたは各td要素からテキストを収集し、' '.join(...)とそれらを結合することができます:

import lxml.html as LH 

content = ''' 
<table> 
    <tr> 
    <td colspan=2>Date</td> 
    </tr> 
    <tr id='something'> 
    <td>8 september</td> 
    <td>2008</td> 
    </tr> 
</table> 
''' 

doc = LH.fromstring(content) 
date = ' '.join(td.text for td in doc.xpath('//table/tr[@id = "something"]/td')) 
print(date) 

利回り

8 september 2008 

それとも、あなたはキャリッジリターンを扱うことができるならば、あなたはtext_content()を使用することができます方法:

for td in doc.xpath('//table/tr[@id = "something"]'): 
    print(td.text_content()) 

s

8 september 
    2008 
関連する問題