Scrapy-简单div [@class] response.xpath属性不返回数据

时间:2018-11-14 21:47:57

标签: python scrapy

我已经编写了一些简单的代码,以便从Indeed搜索页面结果中获取HTML链接。我的起始网址是一个提供招聘广告列表的http地址。我正在尝试抓取页面上显示的每个作业的URL和职位名称。我的问题似乎是titles = response.xpath属性。如果使用作业特定的属性,则会得到数据,但是当我在代码中使用下面显示的属性时,我什么也收不到(甚至列标题也没有)。尽管事实上该属性包含了我需要的所有内容。任何帮助都值得欢迎,因为我只是一个初学者。

我正在输出到CSV文件,并且已经在其他地方成功使用了此代码,所以我想知道这是否与他们编码目标URL页面的方式有关。真让我发疯!

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]

    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles = response.xpath('//div[@class="jobsearch-SerpJobCard row result clickcard"]')

        items = []
        for titles in titles:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = titles.xpath('//h2/a/text()').extract()

            items.append(item)
        return items

感谢Elena的指导,但恐怕您的建议没有任何作用。我仍然没有数据返回。我已经解决了重复变量( titles1中的标题),该变量作为独立更改令人满意地进行了测试。但是,其他建议没有区别。我还尝试过仅通过请求返回URL来运行抓取工具,但仍然无法正常工作。修改后的示例如下。

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]

    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles1 = response.css('div.jobsearch-SerpJobCard.row.result.clickcard')
        #also tried as titles = response.css('div.jobsearch-SerpJobCard row result clickcard')

        items = []
        for titles in titles1:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = titles.xpath('.//h2/a/text()').extract()
        #also tried as item ['role_titletext'] = titles.css('h2 a::text').extract()
            items.append(item)
        return items

编辑: 谢谢Thiago。真是破解!你是超级巨星! 感谢您和Elena对新手的耐心配合。 只是为了完成对其他任何人的交流,我使用的最终代码如下。这将返回搜索页面网址和职位::);

from scrapy.spiders import Spider
from scrapy.selector import Selector
from ICcom4.items import Scrape4Item
from scrapy.linkextractors import LinkExtractor
from scrapy.utils.response import get_base_url
from scrapy.spiders import CSVFeedSpider
import requests

class MySpider(Spider):
    name = "Scrape4"
    allowed_domains = ["indeed.co.uk"]
    start_urls = ['http://www.indeed.co.uk/jobs?as_and=a&as_phr=&as_any=&as_not=IT+construction&as_ttl=Project+Manager&as_cmp=&jt=contract&st=&salary=%C2%A310K-%C2%A3999K&radius=25&l=&fromage=2&limit=50&sort=date&psf=advsrch',]

    def parse(self, response):
        titles = response.css('.jobsearch-SerpJobCard')
        items = []
        for titles in titles:
            item = Scrape4Item()
            base_url = get_base_url(response)
            home_url = ("http://www.indeed.co.uk")
            item ['_pageURL'] = base_url
            item ['role_titletext'] = title.xpath('.//h2/a/@title').extract()
        items.append(item)
        return items

1 个答案:

答案 0 :(得分:0)

我注意到下载的HTML代码中没有<html> <head> <title>Parcel Sandbox</title> <meta charset="UTF-8" /> <link rel="stylesheet" type="style/css" href="./index.css" /> </head> <body> <input type="radio" id="fruit" name="product" value="fruit" /> <label for="fruit">Fruit</label> <input type="radio" id="veg" name="product" value="veg" checked /> <label for="veg">Veg</label> <input type="radio" id="nuts" name="product" value="nuts" /> <label for="nuts">Nuts</label> <input type="radio" id="drink" name="product" value="drink" /> <label for="drink">Drink</label> <p class="fruit veg nuts drink">Product 1</p> <p class="drink">Product 2</p> <p class="veg nuts drink">Product 3</p> <p class="veg nuts">Product 4</p> </body> </html>类,但是在页面加载之后就存在。当然,它是由一些javascript代码添加的。 由于Scrapy无法执行javascript,因此当某些选择器意外失败(而不是“检查元素”)时,您可能需要仔细检查页面源。 除此之外,像“ .jobsearch-SerpJobCard”之类的较短选择器也可以完成这项工作。

关于标题中的问题,要获取属性数据,可以使用clickcardxpath('.//div/@class')。例如:

css('div::attr(class)')