Scrapy是一个网络爬虫,我创建了一个蜘蛛。 我希望蜘蛛用2个链接的主体创建2个html文件。 创建的html文件为空。
import scrapy
from scrapy.selector import Selector
from scrapy.http import HtmlResponse
class DmozSpider(scrapy.Spider):
name = "dmoz"
allowed_domains = ["dmoz.org"]
start_urls = [
"http://www.dmoz.org/Computers/Programming/Languages/Python/Books/",
"http://www.dmoz.org/Computers/Programming/Languages/Python/Resources/"
]
def parse(self, response):
x=response.xpath("//body/text()").extract()
filename = response.url.split("/")[-2] + '.html'
with open(filename, 'wb') as f:
f.write(x)
答案 0 :(得分:-1)
请重新访问Scrapy tutorial并仔细检查;您的示例基本上是dmoz_spider.py
的逐字副本。
首先,请注意xpath()
会返回一个选择器列表。在选择器列表上调用extract()
会为您提供一个unicode字符串列表,您无法按原样将其写入文件。您需要加入字符串并对结果进行编码(例如,使用UTF-8)。
with open(filename, 'wb') as f:
f.write(u"".join(x).encode("UTF-8"))
至于它为什么现在不工作:使用XPath表达式选择body元素的所有文本节点。由于文本节点仅包含空格字符,因此创建的文件显示为空。
response.xpath("//body/text()").extract()
的结果是[u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n ', u'\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ', u'\r\n\r\n ']
,因此您的文件应包含一些空格字符。
要选择body元素下的所有节点,请使用response.xpath("//body/node())
。
例如选择具有班级div
的所有hero
元素,使用response.xpath("//div[@class = 'hero']")
。
也许你应该先阅读一些关于XPath的基础教程。从实践中学习在这里不起作用,你真的需要先掌握基础知识。