5

只是尝试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()
4

9 回答 9

7

代码看起来很旧的版本。我建议改用这些代码

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()
希望它有所帮助,是一个很好的例子。

于 2015-09-04T06:28:46.960 回答
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()
于 2012-09-10T16:27:07.540 回答
2

我有一个类似NameError: name 'hxs' is not defined的问题,以及与空格和制表符有关的问题:IDE 使用空格而不是制表符,您应该检查一下。

于 2013-01-23T23:22:51.477 回答
1

代码看起来正确。

在最新版本的 Scrapy
HtmlXPathSelector 中已弃用。使用选择器:

hxs = Selector(response)
sites = hxs.xpath('//title/text()')
于 2014-02-14T05:14:58.653 回答
0

确保您正在运行您向我们展示的代码。

尝试删除*.pyc项目中的文件。

于 2012-09-05T04:47:16.153 回答
0

这对我有用:

  1. 将文件另存为test.py
  2. 使用命令scrapy runspider <filename.py>

例如:

scrapy runspider test.py
于 2013-08-19T15:01:00.200 回答
0

这只是一个演示,但它有效。需要定制offcourse。

#!/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
于 2014-06-21T19:20:27.290 回答
0

你应该改变

from scrapy.selector import HtmlXPathSelector

进入

from scrapy.selector import Selector

hxs=Selector(response)改为使用。

于 2015-04-26T05:38:32.857 回答
0

我将 Scrapy 与 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
于 2016-10-11T19:13:57.913 回答