在 Scrapy 中抓取和连接
Crawl and Concatenate in Scrapy
我正在尝试使用 Scrapy 抓取电影列表(我只获取导演和电影标题字段)。
有时,有两个导演,Scrapy 将他们描述为不同的。所以第一位导演将有电影名称,但第二位导演将没有电影名称。
所以我创造了这样的条件:
if director2:
item['director'] = map(unicode.strip,titres.xpath("tbody/tr/td/div/div[2]/div[3]/div[2]/div/h2/div/a/text()").extract())
最后一个div[2]只有在有两个董事的情况下才存在。
我想这样连接:director1, director2
这是我的完整代码:
class movies(scrapy.Spider):
name ="movielist"
allowed_domains = ["domain.com"]
start_urls = ["http://www.domain.com/list"]
def parse(self, response):
for titles in response.xpath('//*[contains(concat(" ", normalize-space(@class), " "), " grid")]'):
item = MovieItem()
director2 = Selector(text=html_content).xpath("h2/div[2]/a/text()")
if director2:
item['director'] = map(unicode.strip,titres.xpath,string-join("h2//concat(div[1]/a/text(), ".", div[2]/a/text())").extract())
else:
item['director'] = map(unicode.strip,titres.xpath("h2/div/a/text()").extract())
item['director'] = map(unicode.strip,titres.xpath,string-join("h2//concat(div[1]/a/text(), ".", div[2]/a/text())").extract())
item['title'] = map(unicode.strip,titres.xpath("h2/a/text()").extract())
yield item
样本 HTML 与一位导演:
<h2>
<a href="#">Movie's title</a>
<div>Info</div>
<div><a href="#">Director's name</a></div>
</h2>
有时,当有两个导演时:
<h2>
<a href="#">Movie's title</a>
<div>Info</div>
<div><a href="#">Director's name</a></div>
<div><a href="#">Second director's name</a></div>
</h2>
你能告诉我我的语法有什么问题吗?
我在没有条件和连接的情况下进行了测试,效果很好。
这是我第一次Python所以请多多包涵。
非常感谢。
获取所有董事(1、2 或更多)并加入 join()
:
item['director'] = ", ".join(titles.xpath("h2/div/a/text()").extract())
更好的特定于 Scrapy 的方法是使用 ItemLoader
and Join()
处理器。定义一个 ItemLoader
:
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose, Join
class MovieLoader(ItemLoader):
default_output_processor = TakeFirst()
director_in = MapCompose(unicode.strip)
director_out = Join()
让它担心剥离和连接:
loader = MovieLoader(MovieItem(), titles)
...
loader.add_xpath("director", "h2/div/a/text()")
我正在尝试使用 Scrapy 抓取电影列表(我只获取导演和电影标题字段)。 有时,有两个导演,Scrapy 将他们描述为不同的。所以第一位导演将有电影名称,但第二位导演将没有电影名称。
所以我创造了这样的条件:
if director2:
item['director'] = map(unicode.strip,titres.xpath("tbody/tr/td/div/div[2]/div[3]/div[2]/div/h2/div/a/text()").extract())
最后一个div[2]只有在有两个董事的情况下才存在。
我想这样连接:director1, director2
这是我的完整代码:
class movies(scrapy.Spider):
name ="movielist"
allowed_domains = ["domain.com"]
start_urls = ["http://www.domain.com/list"]
def parse(self, response):
for titles in response.xpath('//*[contains(concat(" ", normalize-space(@class), " "), " grid")]'):
item = MovieItem()
director2 = Selector(text=html_content).xpath("h2/div[2]/a/text()")
if director2:
item['director'] = map(unicode.strip,titres.xpath,string-join("h2//concat(div[1]/a/text(), ".", div[2]/a/text())").extract())
else:
item['director'] = map(unicode.strip,titres.xpath("h2/div/a/text()").extract())
item['director'] = map(unicode.strip,titres.xpath,string-join("h2//concat(div[1]/a/text(), ".", div[2]/a/text())").extract())
item['title'] = map(unicode.strip,titres.xpath("h2/a/text()").extract())
yield item
样本 HTML 与一位导演:
<h2>
<a href="#">Movie's title</a>
<div>Info</div>
<div><a href="#">Director's name</a></div>
</h2>
有时,当有两个导演时:
<h2>
<a href="#">Movie's title</a>
<div>Info</div>
<div><a href="#">Director's name</a></div>
<div><a href="#">Second director's name</a></div>
</h2>
你能告诉我我的语法有什么问题吗?
我在没有条件和连接的情况下进行了测试,效果很好。
这是我第一次Python所以请多多包涵。
非常感谢。
获取所有董事(1、2 或更多)并加入 join()
:
item['director'] = ", ".join(titles.xpath("h2/div/a/text()").extract())
更好的特定于 Scrapy 的方法是使用 ItemLoader
and Join()
处理器。定义一个 ItemLoader
:
from scrapy.contrib.loader import ItemLoader
from scrapy.contrib.loader.processor import TakeFirst, MapCompose, Join
class MovieLoader(ItemLoader):
default_output_processor = TakeFirst()
director_in = MapCompose(unicode.strip)
director_out = Join()
让它担心剥离和连接:
loader = MovieLoader(MovieItem(), titles)
...
loader.add_xpath("director", "h2/div/a/text()")