尝试scrapy并试图让一个基本的蜘蛛工作。我知道这可能是我想念的东西,但我已经尝试过我能想到的一切。
我得到的错误是:
line 11, in JustASpider
sites = hxs.select('//title/text()')
NameError: name 'hxs' is not defined
我的代码目前非常基本,但我似乎无法找到我出错的地方。谢谢你的帮助!
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
class JustASpider(BaseSpider):
name = "google.com"
start_urls = ["http://www.google.com/search?hl=en&q=search"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//title/text()')
for site in sites:
print site.extract()
SPIDER = JustASpider()
答案 0 :(得分:6)
我最后删除了SPIDER调用并删除了for循环。只有一个标题标签(正如人们所期望的那样),它似乎正在抛弃循环。我工作的代码如下:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
class JustASpider(BaseSpider):
name = "google.com"
start_urls = ["http://www.google.com/search?hl=en&q=search"]
def parse(self, response):
hxs = HtmlXPathSelector(response)
titles = hxs.select('//title/text()')
final = titles.extract()
答案 1 :(得分:6)
代码看起来很旧版本。我建议使用这些代码
from scrapy.spider import Spider
from scrapy.selector import Selector
class JustASpider(Spider):
name = "googlespider"
allowed_domains=["google.com"]
start_urls = ["http://www.google.com/search?hl=en&q=search"]
def parse(self, response):
sel = Selector(response)
sites = sel.xpath('//title/text()').extract()
print sites
#for site in sites: (I dont know why you want to loop for extracting the text in the title element)
#print site.extract()
答案 2 :(得分:2)
我遇到了类似的问题NameError: name 'hxs' is not defined
,以及与空格和制表符相关的问题:IDE使用空格而不是制表符,您应该检查它。
答案 3 :(得分:1)
代码看起来正确。
最新版本的Scrapy
不推荐使用HtmlXPathSelector。
使用选择器:
hxs = Selector(response)
sites = hxs.xpath('//title/text()')
答案 4 :(得分:0)
确保您正在运行您向我们展示的代码。
尝试删除项目中的*.pyc
个文件。
答案 5 :(得分:0)
这对我有用:
test.py
scrapy runspider <filename.py>
例如:
scrapy runspider test.py
答案 6 :(得分:0)
这只是一个演示,但它有效。需要在场外定制。
#!/usr/bin/env python
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
class DmozSpider(BaseSpider):
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):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//ul/li')
for site in sites:
title = site.select('a/text()').extract()
link = site.select('a/@href').extract()
desc = site.select('text()').extract()
print title, link, desc
答案 7 :(得分:0)
你应该改变
from scrapy.selector import HtmlXPathSelector
进入
from scrapy.selector import Selector
然后使用hxs=Selector(response)
代替。
答案 8 :(得分:0)
我使用Scrapy with BeautifulSoup4.0。对我来说,汤很容易阅读和理解。如果您不必使用HtmlXPathSelector,这是一个选项。希望这有帮助!
import scrapy
from bs4 import BeautifulSoup
import Item
def parse(self, response):
soup = BeautifulSoup(response.body,'html.parser')
print 'Current url: %s' % response.url
item = Item()
for link in soup.find_all('a'):
if link.get('href') is not None:
url = response.urljoin(link.get('href'))
item['url'] = url
yield scrapy.Request(url,callback=self.parse)
yield item