我是Python初学者,这是我的第一个问题。我正试图从这个Wikipedia page中删除标题和网址并将它们存储在.json中。使用
在scrapy shell中进行初步xpath测试sel.xpath('//tr[@style="vertical-align: top;"]//a')
终端中的显示标记内的网址和标题,但完整的脚本会返回带有空字符串的.json文件,如下所示:
[{"url": [], "title": []},
{"url": [], "title": []},
{"url": [], "title": []},
{"url": [], "title": []}],
以下是整个脚本:
from scrapy.spider import Spider
from scrapy.selector import Selector
from wikipedia.items import WikipediaItem
class MySpider(Spider):
name = "wiki"
allowed_domains = ["en.wikipedia.org"]
start_urls = [
"http://en.wikipedia.org/wiki/Category:2013_films"
]
def parse(self, response):
sel = Selector(response)
titles = sel.xpath('//tr[@style="vertical-align: top;"]//li')
items = []
for title in titles:
item = WikipediaItem()
item["url"] = sel.xpath("a/@href").extract()
item["title"] = sel.xpath("a/text()").extract()
items.append(item)
return(items)
如果你能给我一个提示我在哪里做错了,那就太好了。谢谢!
答案 0 :(得分:2)
这是一个固定的parse()
方法:
def parse(self, response):
sel = Selector(response)
titles = sel.xpath('//tr[@style="vertical-align: top;"]//li')
for title in titles:
item = WikipediaItem()
link = title.xpath("a")
if link:
item["url"] = link.xpath("@href").extract()[0]
item["title"] = link.xpath("text()").extract()[0]
yield item
打印:
{'title': u'+1 (film)', 'url': u'/wiki/%2B1_(film)'}
{'title': u'10,000 Hours', 'url': u'/wiki/10,000_Hours'}
...
请注意,您唯一错误的是您应该使用title
内的xpath进行搜索,而不是使用sel
。
另请注意,您可以直接从循环中yield
项,而不是将提取的项目收集到列表中然后返回它们。
希望有所帮助。