需要从tripAdvisor 中提取更多信息
我的代码:
item = TripadvisorItem()
item['url'] = response.url.encode('ascii', errors='ignore')
item['state'] = hxs.xpath('//*[@id="PAGE"]/div[2]/div[1]/ul/li[2]/a/span/text()').extract()[0].encode('ascii', errors='ignore')
if(item['state']==[]):
item['state']=hxs.xpath('//*[@id="HEADING_GROUP"]/div[2]/address/span/span/span[contains(@class,"region_title")][2]/text()').extract()
item['city'] = hxs.select('//*[@id="PAGE"]/div[2]/div[1]/ul/li[3]/a/span/text()').extract()
if(item['city']==[]):
item['city'] =hxs.xpath('//*[@id="HEADING_GROUP"]/div[2]/address/span/span/span[1]/span/text()').extract()
if(item['city']==[]):
item['city']=hxs.xpath('//*[@id="HEADING_GROUP"]/div[2]/address/span/span/span[3]/span/text()').extract()
item['city']= item['city'][0].encode('ascii', errors='ignore')
item['hotelName'] = hxs.xpath('//*[@id="HEADING"]/span[2]/span/a/text()').extract()
item['hotelName']=item['hotelName'][0].encode('ascii', errors='ignore')
reviews = hxs.select('.//div[contains(@id, "review")]')
1.对于tripAdvisor中的每一家酒店,都有一个酒店的身份证号码。比如这家酒店的80075:http://www.tripadvisor.com/Hotel_Review-g60763-d80075-Reviews-Amsterdam_Court_Hotel-New_York_City_New_York.html#REVIEWS
如何从TA项目中提取此id?
我需要每个酒店的更多信息:shortDescription,stars,zipCode,国家和坐标(long,lat)。我能提取这些东西吗?
我需要为每一篇评论提取旅行者类型。怎样我的代码审查:
for review in reviews: it = Review() it['state'] = item['state'] it['city'] = item['city'] it['hotelName'] = item['hotelName'] it['date'] = review.xpath('.//div[1]/div[2]/div/div[2]/span[2]/@title').extract() if(it['date']==[]): it['date']=review.xpath('.//div[1]/div[2]/div/div[2]/span[2]/text()').extract() if(it['date']!=[]): it['date']=it['date'][0].encode('ascii', errors='ignore').replace("Reviewed","").strip() it['userName'] = review.xpath('.//div[contains(@class,"username mo")]/span/text()').extract() if (it['userName']!=[]): it['userName']=it['userName'][0].encode('ascii', errors='ignore') it['userLocation'] = ''.join(review.xpath('.//div[contains(@class,"location")]/text()').extract()).strip().encode('ascii', errors='ignore') it['reviewTitle'] = review.xpath('.//div[1]/div[2]/div[1]/div[contains(@class,"quote")]/text()').extract() if(it['reviewTitle']!=[]): it['reviewTitle']=it['reviewTitle'][0].encode('ascii', errors='ignore') else: it['reviewTitle'] = review.xpath('.//div[1]/div[2]/div/div[1]/a/span[contains(@class,"noQuotes")]/text()').extract() if(it['reviewTitle']!=[]): it['reviewTitle']=it['reviewTitle'][0].encode('ascii', errors='ignore') it['reviewContent'] = review.xpath('.//div[1]/div[2]/div[1]/div[3]/p/text()').extract() if(it['reviewContent']!=[]): it['reviewContent']=it['reviewContent'][0].encode('ascii', errors='ignore').strip() it['generalRating'] = review.xpath('.//div/div[2]/div/div[2]/span[1]/img/@alt').extract() if(it['generalRating']!=[]): it['generalRating'] =it['generalRating'][0].encode('ascii', errors='ignore').split()[0]
有一本很好的手册如何找到这些东西?我失去了所有的跨度和深度。。
谢谢!
我将尝试在纯XPath中执行此操作。不幸的是,看起来你想要的大部分信息都包含在<script>
标签中:
酒店ID-退货;80075〃
substring-before(normalize-space(substring-after(//script[contains(., "geoId:") and contains(., "lat")]/text(), "locId:")), ",")
或者,正如另一位回答者所提到的,酒店ID在URL中。如果你确定格式总是相同的(比如在ID之前包含一个"d"),那么你可以使用它。
评级(顶部的一个)-返回";3.5〃
//span[contains(@class, "rating_rr")]/img/@content
这个页面上有几个评级实例。排名靠前的主要评分是我在这里获得的。我还没有在Scrapy中测试过这一点,所以它可能是由JavaScript弹出的,最初并没有作为HTML的一部分加载。如果是这样的话,您需要在其他地方获取它,或者使用Selenium/PantomJS之类的东西。
邮政编码-退货;10019"
(//span[@property="v:postal-code"]/text())[1]
同样,与上述交易相同。它在HTML中,但您应该在页面加载时检查它是否在那里。
Country-Returns"US"
substring-before(substring-after(//script[contains(., "modelLocaleCountry")]/text(), "modelLocaleCountry = "), ";")
这本书附有引号。您总是可以(而且应该)使用管道来清理刮取的数据,使其看起来像您想要的那样。
坐标-返回;40.76174〃;以及"-73.985275〃;,分别
Lat:substring-before(normalize-space(substring-after(//script[contains(., "geoId:") and contains(., "lat")]/text(), "lat:")), ",")
Lon:substring-before(normalize-space(substring-after(//script[contains(., "geoId:") and contains(., "lat")]/text(), "lng:")), ",")
我不完全确定这个页面上的简短描述在哪里,所以我没有包括它。你可能必须导航到其他地方才能得到它;旅行者类型";意思是,所以我把这个留给你。
就手册而言,它实际上是关于实践的。您学习了在XPath中工作的技巧和窍门,Scrapy允许您使用一些添加的功能,如正则表达式和管道。我不建议做整个";绝对路径";XPath(即./div/div[3]/div[2]/ul/li[3]/...
),因为与DOM中的任何偏差都会完全破坏您的抓取。如果你有很多数据要收集,并且你计划将其保留一段时间,那么如果任何网站移动,即使是一个<div>
,你的项目也会很快变得难以管理。
我推荐更多";查询";XPaths,例如//div[contains(@class, "foo")]//a[contains(@href, "detailID")]
。这样的路径将确保,无论你知道元素之间放置了多少元素,即使多个目标元素彼此略有不同,你也能够始终如一地获取它们。
XPath是一个反复试验的过程。很多。以下是一些对我有很大帮助的工具:
- XPath帮助程序(Chrome扩展)
scrapy shell <URL>
scrapy view <URL>
(用于在浏览器中呈现Scrapy的响应)- PhantomJS(如果您有兴趣获得通过JavaScript插入的数据)
希望这些能有所帮助。
使用正则表达式从URL获取它可以接受吗?
id = re.search('(-d)([0-9]+)',url).group(2)