我必须抓取下面的url,它基本上包含评论。所有的评论,都有一个评论作者的名字,一个评论的标题,和一个评论本身。
我选择了“”来完成这个任务。
但是上面提到的url不是start,我将从基本的parse
方法中获得它。在解析中,我将初始化一个itemLoder
。我将在那里提取几个项目,并通过响应的meta
传递项目。(提取的字段包含酒店名称、地址、价格等信息。)
我还声明了一些项目,即"review_member_name“、"review_quote”、"review_review“
页面中有多个评审,并且可以从response.url
获得评审id。(如下面的解析方法所示)
由于有许多评论,而且所有的评论都将共享相同的项目名称,所以这些项目都会得到连接的,这是不应该发生的。有人能给我建议解决这个问题的方法吗?
下面是我的parse_review来源。
def parse_review(self,response):
review_nos = re.search(".*www\.tripadvisor\.in/ExpandedUserReviews-.*context=1&reviews=(.+)&servlet=Hotel_Review&expand=1",response.url).group(1)
review_nos = review_nos.split(',') # list of review ids
for review_no in review_nos:
item = response.meta['item']
#item = ItemLoader(item=TripadvisorItem(), response=response) - this works fine but I will lose the items from parse method
div_id = "expanded_review_"+review_no
review = response.xpath('/html/body/div[@id="%s"]'%div_id)
member_name = review.xpath('.//div[@class="member_info"]//div[@class="username mo"]//text()').extract()
if member_name:
item.add_value('review_member_name', member_name)
review_quote = review.xpath('.//div[@class="innerBubble"]/div[@class="quote"]//text()').extract()
if review_quote:
item.add_value('review_quote', review_quote)
review_entry = review.xpath('.//div[@class="innerBubble"]/div[@class="entry"]//text()').extract()
if review_entry:
item.add_value('review_review', review_entry)
yield item.load_item()
下面是我的items.json ("review_review“正在被删除,解析方法中的项也被删除)
[{"review_quote": "\u201c Fabulous service \u201d", "review_member_name": "VimalPrakash"}, {"review_quote": "\u201c Fabulous service \u201d \u201c Indian hospitality at its best, and honestly the best coffee in India \u201d", "review_member_name": "VimalPrakash Jessica P"}, {"review_quote": "\u201c Fabulous service \u201d \u201c Indian hospitality at its best, and honestly the best coffee in India \u201d \u201c Nice hotel in a central location \u201d", "review_member_name": "VimalPrakash Jessica P VikInd"}]
请为这个问题建议一个好的标题。
发布于 2014-07-15 03:36:49
在对其执行ItemLoader
之前,您必须创建一个新的add_value
;现在您正在创建一个项,并在循环中一次又一次地向它添加新的值。
for review_no in review_nos:
item = ItemLoader(item=projectItem(), response=response)
...
yield item.load_item()
您还可以在提供的xpath中直接使用.add_xpath
,并在创建ItemLoader
时使用response.xpath
作为项的选择器,这样您就可以避免所有的if测试,让load做它应该做的事情: load item。
https://stackoverflow.com/questions/24754531
复制相似问题