2012-02-27 171 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的 – 2012-02-27 22:07:55

+0

可能重複[XPath的返回排位子節點值的字符串連接(HTTP://計算器.com/questions/1403971/xpath-to-return-string-concatenation-qualifying-child-node-values) – 2012-02-27 22:08:42

回答

2

純XPath 1.0解決方案。

用途:

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

令人驚歎。如果我將有「 ...」30x,如何從中得到30x的字符串? – acheruns 2012-02-27 23:22:42

+1

@acheruns:如果你有這個節點30次,那麼只有XPath 1.0不可能獲得所有需要的字符串。您必須在循環中評估XPath表達式30次(從1到count(表達式)),每次使用不同的索引。 'string(normalize-space((// table/tr [@id ='something'])[$ k]))'---其中'$ k'必須被1到count的數字// table/tr [@id ='something'])' – 2012-02-27 23:36:30

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 
相關問題