我必须废弃一些网页,其内容类似于此
<html>
<body>
<div id="desc">
description data
</div>
<div id="details">
<div class="title">title</div>
<div class="writer">writer name</div>
<div class="release">12/12/12</div>
</div>
</body>
</html>
这里带有id'详细信息'的div有许多有用的内容,而且一些有用的内容也在外面
什么是解析函数的好习惯
1)对所有项目使用loader.add_xpath
sel = Selector(response)
loader = ItemLoader(selector=sel)
loader.add_xpath("title", 'title_xpath_to_get_item_from_full_response')
loader.add_xpath("writer", 'writer_xpath_to_get_item_from_full_response')
loader.add_xpath("description ", 'description _xpath_to_get_item_from_full_response')
2)找到一些公共节点并定义相对于该节点的xpath
sel = Selector(response)
loader = ItemLoader(selector=sel)
common = sel.xpath('xpath_for_div_id_details')
title= common .xpath('./title_xpath_to_get_item_from_common').extract()[0]
loader.add_value('title', title)
writer= common .xpath('./writer_xpath_to_get_item_from_common').extract()[0]
loader.add_value('writer', writer)
loader.add_xpath("description ", 'description _xpath_to_get_item_from_full_response')
答案 0 :(得分:0)
拟议方法之间的差异实际上是微乎其微的。由于您可以在第一个版本中包含div[@id='']
(这是强烈建议的,否则您可能会得到错误的数据),结果是相同的。唯一的区别可能在于代码可读性和执行速度。当你有一个清晰的结构并且XPath表达式不会太长而无法放入一行时,我会选择第一种方法。另一种方法应该快一点,所以如果你有大量的数据要处理,我会建议第二种方法(即有很多页面在细节中有很多项目,页面本身很大,所以使用一个子选择器应该稍快一点。)