1

イベントの Web サイトをスクレイピングしようとしていますが、イベントの名前と場所をスクレイピングするためのコードが添付されています。出力を csv ファイルに書き込みますが、csv ファイルにはすべてのイベント名が 1 行に追加されています。

たとえば、Bruno Mars と Maroon 5 という 2 つのイベントがあり、その場所が San Jose、Santa Clara であるとします。現在の出力は、

event_name event_location

ブルーノ・マーズ、マルーン 5 サンノゼ、サンタクララ

見たかったけど、

event_name event_location

ブルーノ・マーズ サンノゼ

マルーン5サンタクララ.

このフォーマットが私にとって奇妙になっている理由を誰かに教えてもらえますか? ここにコードを添付しました。次にscrapy crawl event_spider -o output.csv -t csv、コードを実行するために使用します。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector

from event_test.items import EventItem


class EventSpider(BaseSpider):
    name = "event_spider"
    allowed_domains = ["eventful.com"]
    start_urls = [
         "http://eventful.com/sanjose/events"
    ]

   def parse(self, response):
     hxs = HtmlXPathSelector(response)
     events = hxs.select("/html/body[@id='events']/div[@id='outer-container']/div[@id='mid-container']/div[@id='inner-container']/div[@id='content']/div[@class='cols-2-1']/div[@class='alpha']/div[@id='top-events']/div[@class='section top-events cage-dbl-border cage-bdr-mdgrey']/div[@id='events-scroll']/div[@id='events-scroll-items']/ul[@id='events-scroll-items-list']/li[@class='top-events-item  ']")
     items = []
     for event in events:
        item = EventItem()
        item['event_name'] = event.select("//h2/a/span/text()").extract()
        item['event_locality'] = event.select("//span[@class='locality']/text()").extract()
        items.append(item)
     return items
4

1 に答える 1

1

スパイダーのコードと xpath を簡略化しました。

from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from event_test.items import EventItem


class EventSpider(BaseSpider):
    name = "event_spider"
    allowed_domains = ["eventful.com"]
    start_urls = ["http://eventful.com/sanjose/events"]

    def parse(self, response):
        hxs = HtmlXPathSelector(response)
        events = hxs.select("//li[contains(@class, 'top-events-item')]")
        for event in events:
            item = EventItem()
            item['event_name'] = event.select(".//h2/a/span/text()").extract()[0]
            item['event_locality'] = event.select(".//span[@class='locality']/text()").extract()[0]
            yield item

csv ファイルで得られる内容は次のとおりです。

event_name,event_locality
Under the Influence of Music Tour,Mountain View
Bruno Mars,San Jose
John Mayer: Born & Raised Tour 2013,Mountain View
New Kids on the Block with 98 Degrees and ...,San Jose
Amy Grant,San Jose
Styx,Saratoga
Bob Dylan with Wilco,Mountain View
Kenny Chesney with Eli Young Band,Mountain View
Smash Mouth \/ Sugar Ray \/ Gin Blossoms \...,Saratoga
Creedence Clearwater Revisited \/ 38 Special,Saratoga

それが役立つことを願っています。

于 2013-07-10T18:15:40.980 に答える