这是我需要使用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中抓取这个页面吗?
答案 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 TakeFirst
或Join
处理器可以帮助您在商品字段中包含字符串值。
答案 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()
我希望这可以提供帮助。