gpt4 book ai didi

python - Scrapy 输出格式化困难

转载 作者:太空宇宙 更新时间:2023-11-03 18:25:32 24 4
gpt4 key购买 nike

我是一名 Python 新手,正在研究 Scrapy 蜘蛛,该蜘蛛旨在检索 Yelp 上特定企业的所有评论。这是我到目前为止的代码,大部分有效:

from scrapy.spider import Spider
from scrapy.selector import Selector
from scrapy.http import Request
import re

# List of businesses to be crawled
RESTAURANTS = ['sixteen-chicago']

# Check number of reviews and create links to compensate for pagination
def createRestaurantPageLinks(self, response):
reviewsPerPage = 40
sel = Selector(response)
totalReviews = int(sel.xpath('//div[@class="rating-info clearfix"]//span[@itemprop="reviewCount"]/text()').extract()[0].strip().split(' ')[0])
pages = [Request(url=response.url + '?start=' + str(reviewsPerPage*(n+1)), callback=self.parse) for n in range(totalReviews/reviewsPerPage)]
return pages

class YelpSpider(Spider):
name = "yelp"
allowed_domains = ["yelp.com"]
start_urls = ['http://www.yelp.com/biz/%s' % s for s in RESTAURANTS]

def parse(self, response):
requests = []
sel = Selector(response)
reviews = sel.xpath('//div[@class="review-list"]')
for review in reviews:
venueName = sel.xpath('//meta[@property="og:title"]/@content').extract()
reviewer = review.xpath('.//li[@class="user-name"]/a/text()').extract()
reviewerLoc = review.xpath('.//li[@class="user-location"]/b/text()').extract()
rating = review.xpath('.//div[@itemprop="review"]//meta[@itemprop="ratingValue"]/@content').extract()
reviewDate = review.xpath('.//meta[@itemprop="datePublished"]/@content').extract()
reviewText = review.xpath('.//p[@itemprop="description"]/text()').extract()
print venueName, reviewer, reviewerLoc, reviewDate, rating, reviewText

if response.url.find('?start=') == -1:
requests += createRestaurantPageLinks(self, response)

return requests

但是,输出并不是我所期望的。我预计会有类似这样的事情:

[u'venue name', u'reviewer', u'reviewer location', u'rating', u'review date', u'text of review']
[u'venue name', u'second reviewer', u'second reviewer location', u'second rating', u'second review date', u'second text of review']
[...]

但我得到的是一行中每个变量的每个实例 - 所有审阅者姓名都彼此并排,所有审阅日期都彼此并排,等等。例如:

[u'Sharon C.', u'Steven N.', u'Michelle R.', u'Raven C.', u'Shelley M.', u'Kenneth S.', u'Liz L.', u'Allison B.', u'Valerie v.', u'Joy G.', u'Aleksandra W.', u'Jennifer J.', u'Emily M.', u'Danny G.', u'atima k.', u'Anna V.', u'Matt L.', u'Jay R.', u'Miss O.', u'Kathy O.', u'Happiness L.', u'Heidi J.', u'Maria A.', u'RD E.', u'Tom M.', u'Isaac G.', u'Michael P.', u'Mark P.', u'Stephanie P.', u'Jennifer L.', u'X X.', u'Erika H.', u'Ginger D.', u'Susan E.', u'Simone J.', u'Rick G.', u'Alia K.', u'Brent C.', u'Dan B.', u'Patricia H.']
[u'Hampshire, IL', u'Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'Indian Head Park, IL', u'Evanston, IL', u'Chicago, IL', u'Chicago, IL', u'Clearwater, FL', u'Chicago, IL', u'Worth, IL', u'Chicago, IL', u'Indianapolis, IN', u'Halifax, Canada', u'Manhattan, NY', u'Chicago, IL', u'Chicago, IL', u'Wicker Park, Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'Evanston, IL', u'Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'San Diego, CA', u'Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'Chicago, IL', u'Evanston, IL', u'Chicago, IL', u'Lisle, IL', u'Chicago, IL', u'Chicago, IL', u'Winnetka, IL', u'Torrance, CA']
[...]

我尝试过导出为项目,但最终得到了相同的结果。我相信我可能需要某种系列或其他东西来促进我想要的东西,但我已经达到了我的专业知识的极限。任何帮助将非常感激!

最佳答案

脚本看起来不错,除了一件事:reviews指向 <div>这是页面上所有评论的包装,而不是每个单独的评论。因此,当 ScraPy 寻找 //div[@class="review-list"] 时,它会立即返回页面上的所有评论。当它进入 for循环,它最终只会迭代一项。该项目包含页面上的所有评论,因此尝试获取 .//li[@class="user-name"]/a/text()例如,最终会一次性为您提供该页面的所有审阅者。

如果你改变reviews = sel.xpath('//div[@class="review-list"]')reviews = sel.xpath('//div[@class="review review-with-no-actions"]') ,你就会明白我的意思了(只要查看“十六支蜡烛”的 Yelp 页面,我就可以看到每个单独的评论都包含在类 review review-with-no-actions 的 div 中)。随着这一变化,reviews在你的脚本中变成一个列表,每行一个评论,而不是所有评论都在一行中。 for循环现在有一堆单独的评论可供迭代,这样当它寻找 .//li[@class="user-name"]/a/text() 时,例如,在每次迭代中,它只会找到一个匹配项(而不是页面中的所有匹配项)。

编辑:tl;dr:我认为这不是代码的问题,而是您将 Yelp 评论页面的代码指向的位置的问题。

关于python - Scrapy 输出格式化困难,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23284864/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com