私はいくつかのアジアのウェブサイトから何かをクロールするためにスクレイピーを使用しています。それらのいくつかは utf8 エンコーディングを使用します。しかし、「gb2312」のように別のものを使用する人もいます。
パイプラインとアイテムの代わりに、独自の出力ステートメントを作成します。これは、動作する yelp レストラン レビューのスクレイピー コードです。
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
#from crawlsite.items import ReviewItem
import re
class ReviewSpider(BaseSpider):
name = "yelp"
allowed_domains = ['yelp.com']
start_urls = ['http://www.yelp.com/biz/providence-los-angeles-2']
#call back function when received response
def parse(self, response):
hxs = HtmlXPathSelector(response)
stars = hxs.select('//meta[@itemprop="ratingValue"]/@content').extract()
review = hxs.select('//p[@itemprop="description"]').extract()
url = response.url
date = hxs.select('//meta[@itemprop="datePublished"]/@content').extract()
user = hxs.select('//li[@class="user-name"]/a/text()').extract()
file = open('crawled.xml', 'a')
starting = str(url)[55:]
startingid = 0
if starting.isdigit():
startingid = int(starting)
id = 0
while id < 40:
file.write('\n<doc id="%s">\n' % str(id + 1 + startingid))
#the first stars rating is the overall rating
file.write('\t<stars>%s</stars>\n' % stars[id+1])
file.write('\t<url>\n\t%s\n\t</url>\n' % url)
file.write('\t<date>%s</date>\n' % date[id])
#user can be unicode as well
file.write('\t<user>%s</user>\n' % user[id].encode('utf8'))
#there is no title for yelp reviews
file.write('\t<title>NULL</title>\n')
#need to stripe the review
file.write('\t<review>\n\t')
review[id] = re.sub('<[^<]+?>', '', review[id])
file.write(review[id].encode('utf8'))
file.write('\n\t</review>\n')
star = stars[id+1]
polarity = "NULL"
confidence = "NULL"
file.write('\t<polarity>%s</polarity>\n' % polarity)
file.write('\t<confidence>%s</confidence>\n' % confidence)
file.write('</doc>\n')
id += 1
file.close()
一部のレビューにはフランス語またはスペイン語が含まれていることに注意してください。ただし、それらはすべて「utf8」です。
file.write(review[id].encode('utf8'))
これは、異なるエンコーディングでアジアの Web サイトをクロールするためのコードです。
allowed_domains = ['duanwenxue.com']
start_urls = ['http://www.duanwenxue.com/article/113415.html']
def parse(self, response):
hxs = HtmlXPathSelector(response)
content = hxs.select('//div[@class="content-in-similar"]/p/text()').extract();
file = open('crawled.xml', 'a')
file.write(str(content).decode('GB2312'))
file.close()
出力ファイルは次のようになります。
[u'\u4e00\u5927\u5b66\u751f\u88ab\u654c\u4eba\u6293\u4e86\uff0c\u654c\u4eba\u628a\u4ed6\u7ed1\u5728\u4e86\u7535\u7ebf\u6746\u4e0a\uff0c\u7136\u540e\u95ee\u4ed6\uff1a\u8bf4\uff0c\u4f60\u662f\u54ea\u91cc\u7684\uff1f\u4e0d\u8bf4\u5c31\u7535\u6b7b\u4f60\uff01\u5927\u5b66\u751f\u56de\u4e86\u654c\u4eba\u4e00\u53e5\u8bdd\uff0c\u7ed3\u679c\u
w3c を使用してエンコーディングを確認しましたが、正しいはずです。str(content).decode('GB2312').encode('utf8') と同様の組み合わせを試しましたが、すべて機能しません。