1

特定の HTML コードの Web サイトをスクレイピングし、データを csv ファイルにエクスポートしようとしています。エクスポートされたコードは正規表現と文字コードでいっぱいで、各セルは [' '] で囲まれています。以下は、エクスポートされたデータの一部の例です。

    [u'<td colspan="2"><b><big>Universal  Universal<br>3 \xbd" ID. to 4"OD. Adapter  T409<br><br></big></b><table cellpadding="0" cellspacing="0" style="width: 300px; float:\nright; margin-right: 5px; border: 0px white solid; text-align:\ncenter;"><tr><td style="text-align: center;"><a href="products/images/med/UA1007.jpg" rel="thumbnail" title="UA1007"><img src="products/images/thumbs/UA1007.jpg" width="300px" align="right" style="border: 5px outset #333333;"></a></td></tr><tr><td style="text-align: center;"><table cellpadding="0" cellspacing="0" style="border: 0px solid white; width:\n300px; margin-left: auto; margin-right: auto;"><tr><td style="width: 33%; text-align: center;"></td><td style="width: 34%; text-align:  center;"></td><td style="width: 33%; text-align:  center;"></td></tr><tr><td></td><td></td><td></td></tr></table></td></tr></table>UA1007<br>\n3 1/2" ID to 4" OD, 7" Length <br>\nFits all pickup models<br><br>\nNow you can hook-up to your MBRP 4" and 5" hardware no matter what size your system. This adaptor is built from T409 stainless steel.<br><br><table><tr></tr></table></td>']

これは、スパイダーに使用しているコードです。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from MBRP.items import MbrpItem

class MBRPSpider(BaseSpider):

      name = "MBRP"
      allowed_domains = ["mbrpautomotive.com"]
      start_urls = [
           "http://www.mbrpautomotive.com/?page=products&part=B1410"
        #* thats just one of the url's I have way more in this list *
      ]

    def parse(self, response):

        hxs = HtmlXPathSelector(response)
        sites = hxs.select('/html')
        items = []
        for site in sites:
            item = MbrpItem()   
            item['desc'] = site.select('//td[@colspan="2"]').extract()
            item['PN'] = site.select('//b/big/a').extract()
            items.append(item)

        return items

そして、これは私がパイプラインで使用しているコードです。

import csv

class MBRPExporter(object):

    def __init__(self):
        self.MBRPCsv = csv.writer(open('output.csv', 'wb'))
        self.MBRPCsv.writerow(['desc', 'PN'])

    def process_item(self, item, spider):
        self.MBRPCsv.writerow([item['desc'], item['PN']])
        return item

utf-8 でのエンコードが役立つと信じて、このようなパイプライン コードを使用しようとしましたが、これによりエラーが発生しましexceptions.AttributeError: 'XPathSelectorList' object has no attribute 'encode'た。

import csv

class MBRPExporter(object):

    def __init__(self):
        self.MBRPCsv = csv.writer(open('output.csv', 'wb'))
        self.MBRPCsv.writerow(['desc', 'PN'])

    def process_item(self, item, spider):
        self.MBRPCsv.writerow([item['desc'].encode('utf-8'), item['PN'].encode('utf-8')])
        return item

utf-8でエクスポートする必要があると信じているのは正しいですか? もしそうなら、どうすればそれを行うことができますか?または、エクスポートされたデータをクリーンアップする他の方法はありますか?

4

1 に答える 1

0

消費者が必要としない限り、csv 出力をエンコードする必要はありません。extract() メソッドは、リスト (XPathSelectorList リスト) を生成します。

site.select('//td[@colspan="2"]').extract()

また、リストで encode() を使用することはできません。リストに参加するか、アイテムを返却する前に最初のリストを取ることができます:

item = MbrpItem()
item['desc'] = ' '.join(site.select('//td[@colspan="2"]').extract())
item['PN'] = join(site.select('//b/big/a').extract()[0])
items.append(item)

またはアイテムローダーを使用できます:

from scrapy.contrib.loader import XPathItemLoader
from scrapy.contrib.loader.processor import Join, TakeFirst

def parse(self, response):
    l = XPathItemLoader(response=response, item=MbrpItem())
    l.add_xpath('desc', '//td[@colspan="2"]', Join(' '))
    l.add_xpath('PN', '//b/big/a', TakeFirst())

    return l.load_item()
于 2012-08-08T18:19:54.670 に答える