2011-11-10 126 views
0

我是xpath的新手,请耐心等待。目前,我正在寻找使用scrapy刮一些内容了一些网页,内容看起来是这样的:scrapy xpath帮助需要

 <td colspan="3" valign="top" class="regular">Landsize: 84,000sq with an extensive shoreline 750m<br /> 
<br /> 
Call Or Email for more info<br /> 

. Full-length Olympicpool,children pool,jacuzzi<br /> 
\' Landscapesdkey bridges<br /> 
. 2 tennis courts<br /> 
. water features True seafront development with iconic design by architect Daniel Libeskind<br /> 
lconic residential, located less than\' 150 metres from the shoreline<br /> 
<br /> 
opposite the future integrated resort on sentosa Island.<br /> 

A part of keppel Bay world calss water front precinct with luxury homes.<br /> 
<br /> 
Call or email for more info </td> 

具体来说,我用以下hxs.select('//tr[contains(td,"Description")]/following-sibling::tr[1]/td/text()').extract()

然而,这样做会由于内容被<br>分隔,因此将结果项目分成列表。如果我从xpath中排除text(),则<td>元素将包含在所得字符串中,这是不可取的。

在xpath中有没有一种方法可以确保我的结果字符串是上面显示的但没有td标签的所有内容?我希望我不需要手动回加列表<br/>

回答

3

从您的评论来看,Evan的正确答案是,您想跳过NL

在这种情况下,尝试:

normalize-space(//tr[contains(td,"Description")]/following-sibling::tr[1]/td) 

注意

  1. 如果参数normalize-space()选择多个节点,此功能将只返回处理结果第一选定节点。

  2. 删除所有前导和尾随空格字符。所有相邻空白字符的中间组被替换为单个空格字符。

+0

其实我只是想留住
,但希望​​删除。 – goh

+0

@iws:那么你想要的是不可能实现评估一个XPath表达式 - XPath是一个* query *语言的XML - 因此它只是*选择*节点集并且从不删除或修改节点。使用XPath,您可以只获取元素的字符串值(根本不包含后代节点),或者如果您想获取其子节点,则这些元素中的元素将具有其所有子元素/子元素。 –

0

尝试在调用string()时包装表达式,它返回节点的字符串值,它是所有字符串值的串联节点的后代文本节点。

string(//tr[contains(td,"Description")]/following-sibling::tr[1]/td) 
+0

试图字符串(),但它转变成
\ r \ n – goh