如何在Xpath中为空节点分配值?

时间:2015-04-28 22:42:51

标签: python html xpath web-scraping scrapy

这是我需要使用Xpath scrapy进行爬行的部分:

- (NSString *)pickerView:(UIPickerView *)pickerView
         didSelectRow:(NSInteger) row 
         inComponent:(NSInteger) component {
    NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
    NSString *_myClass = self.classNames[row];
    [prefs setObject:_myClass forKey:@"class"];
}

我的xpath表达式是:

<tr class="o"><td>Alabama</td><td><code>US.AL</code></td><td><code>US01</code></td><td>Ala.</td><td>-6~</td><td class="n">4,779,736</td><td class="n">133,916</td><td class="n">51,705</td><td>2</td><td>Montgomery</td><td>Alabamian</td><td>350-369</td></tr>
<tr class="e"><td>Alaska</td><td><code>US.AK</code></td><td><code>US02</code></td><td></td><td>-9~</td><td class="n">710,231</td><td class="n">1,530,700</td><td class="n">591,007</td><td>6</td><td>Juneau</td><td>Alaskan</td><td>995-999</td></tr>

但是在#34; Alaska&#34;中有一个空节点。这是response.xpath('//tr[@class="o" or @class="e"][2]/descendant::*').extract() &#34; US02&#34;之后的<td>节点。它不会发生在阿拉巴马州。

当我使用表达式时:

<code>

要提取文本,这个空节点将被忽略。

但我必须遵守格式。那么如何将这个空节点设置为空格?

顺便说一句,任何人都可以有一个更好的解决方案来在scrapy中抓取这个页面吗?

http://www.statoids.com/uus.html

2 个答案:

答案 0 :(得分:0)

我会在这里尽可能明确地以“按列”方式获取数据:

for state in response.xpath('//tr[@class="o" or @class="e"]'):
    item = State()
    item["hasc"] = state.xpath(".//td[2]/code/text()").extract()
    ...
    yield item

其中State是您的Item课程。请注意,extract()会返回list。使用item loader TakeFirstJoin处理器可以帮助您在商品字段中包含字符串值。

答案 1 :(得分:0)

您可以选择空元素,这些元素是没有文本或子元素的元素

\*[not(text()) and not(*)] 

所以选择空元素的XPATH将是

//tr[@class='o' or @class='e'][2]/descendant::*[not(text()) and not(*)] 

如果我们想获得一个值&#34;空&#34; 的字符串,我们可以附加 concat 方法

//tr[@class='o' or @class='e'][2]/descendant::*[not(text()) and not(*)]/concat(.,'Empty')

所以最后你可以 | 获得非空单元格

response.xpath('//tr[@class="o" or @class="e"][2]/descendant::*/text() | //tr[@class="o" or @class="e"][2]/descendant::*[not(text()) and not(*)]/concat(.,"Empty")).extract()

我希望这可以提供帮助。