我很难获得基本的(非常基本的)html页面来输出我正在使用的Scrapy蜘蛛的任何东西,希望有人可以把我放在正确的道路上。
我试图抓取的HTML示例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<head>
<link rel="shortcut icon" href="../images/favicon.ico">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Content-Style-Type" content="text/css">
<link rel="stylesheet" href="../include/default.css" type="text/css">
<meta name="Author" content="Author">
<title>Article Title</title>
</head>
<body>
<h3>Month Day, Year</h3>
<hr size="1">
<h4>Article Title Here:</h4>
<p>paragraph 1, Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo</p>
<p>paragraph 2. Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium.</p>
<p>paragraph 3, Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium.</p>
<p>closing, Sed ut perspiciatis unde omnis iste natus </p>
<hr size="1">
</body>
</html>
我正试图用下面的Scrapy蜘蛛抓它
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import HtmlXPathSelector
from basic.items import BasicItem
class BasicSpider(CrawlSpider):
name = "basiccrawl"
allowed_domains = ["example.com"]
start_urls = [
"http://example.com/articles/",
]
def parse(self, response):
hxs = HtmlXPathSelector(response)
date = hxs.xpath('//h3')
title = hxs.xpath('//h4')
body = hxs.xpath('//p')
yield item
我认为我过分简化了xpath规则?
答案 0 :(得分:0)
如果你的蜘蛛是CrawlSpider的子类,它不应该覆盖默认的解析回调(它由CrawlSpider类在内部使用)。当您开始使用Scrapy时,这有点令人困惑,它可能会在将来的版本中得到解决。
在你发布的代码中,你没有使用CrawlSpider规则,所以也许你可以问问自己是否真的需要从CrawlSpider继承。你只能继承scrapy.Spider
。
XPath表达式看起来很好,但.xpath()
方法只返回一个选择器,你错过了对.extract()
方法的调用。此外,您可能不需要实例化选择器,如果您使用的是Scrapy 0.24+,您可以这样做:
def parse(self, response):
date = response.xpath('//h3').extract()
title = response.xpath('//h4').extract()
body = response.xpath('//p').extract()
yield item
你可能想要阅读我写过的Scrapy教程,试图让你很快开始:http://hopefulramble.blogspot.com/2014/08/web-scraping-with-scrapy-first-steps_30.html
答案 1 :(得分:0)
你几乎是在正确的路径上,你需要使用方法extract(),该方法将返回一个元素列表,如果你正在开始学习,也许我创建的关于Scrapy的slidehare可以帮助你:D http://www.slideshare.net/franciscoyes/scrapy-42681497