2012-02-27 149 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 
相关问题