scrapy scrappy返回空对象

pbwdgjma  于 2022-11-09  发布在  其他
关注(0)|答案(3)|浏览(167)

我使用的是css选择器,并不断得到一个空值的响应。

import scrapy 

class WebSpider(scrapy.Spider):
name = 'activities'
start_urls = [
    'http://capetown.travel/events/'
]

def parse(self, response):
    all_div_activities = response.css("div.tribe-events-content")#gdlr-core-pbf-column gdlr-core-column-60 gdlr-core-column-first
    title = all_div_activities.css("h2.tribe-events-list-event-title::text").extract()#gdlr-core-text-box-item-content
    price = all_div_activities.css(".span.ticket-cost::text").extract()
    details = all_div_activities.css(".p::text").extract()
    yield {
        'title':title,
        'price':price,
        'details':details
    }
iqih9akk

iqih9akk1#

在你的代码中,你希望选择所有的事件,但输出将是一个列表,你不能选择标题等使用extract()与一个列表,因为你试图这样做。
这就是为什么你没有得到你想要的数据。你需要使用一个for循环来循环页面上的每个事件,在你的例子中循环all_div_activities

脚本代码

def parse(self,response):
    all_div_activities = response.css('div.tribe-events-event-content')
    for a in all_div_activities:
        title = a.css('a.tribe-event-url::text').get()

        if a.css('span.ticket-cost::text'):
            price = a.css('span.ticket-cost::text').get()
        else: 
            price = 'No price'

        details = a.css('div[class*="tribe-events-list-event-description"] > p::text').get()

        yield { 
               'title':title.strip(),
                'price':price,
                'details':details
              }

备注
1.对price使用if语句,因为有些元素根本没有price,所以输入一些信息是一个好主意。
1.当产生字典时,在标题上使用strip(),因为标题有空格和附加的\n。

建议

作为次要的一点,Scrapy建议使用get,()并获取()方法而不是extract_first()并提取().带摘录()并不总是能够知道输出是否是列表,在这个例子中,我得到的输出是一个列表,这就是为什么ScrapyDocs建议使用get()。它也更紧凑。使用get(),你总是会得到一个字符串。这也意味着我可以去掉换行符和标题空格,就像你在上面的代码中看到的那样。
另一个提示是如果class属性很长,只要你选择的partial属性能为你想要的数据提供唯一的结果,就使用 *=选择器。
从长远来看,使用项目而不是生成字典可能更好,因为您可以为页面上某些事件中的数据设置默认值,而在其他事件中则不是。您必须通过管道来完成这一点(如果您不理解这一点,也不用担心)。请参阅项目的文档,并参阅here以了解更多关于项目的信息。

q5iwbnjs

q5iwbnjs2#

这是我的,希望对你有帮助。

for item in response.css('div.tribe-events-event-content'): 
    print(item.css('a.tribe-event-url::text').get()) 
    print(item.css('span.ticket-cost::text').get()) 
    print(item.css('p::text').get())
  • 谢谢-谢谢
kx5bkwkv

kx5bkwkv3#

下面是修复代码的一些步骤

  • 当在表示元素类名的名称前使用句点而不是HTML标记本身时..所以将.span.ticket-cost::text--〉span.ticket-cost::text也改为.p::text--〉p::text
  • 很明显,您尝试获取字符串,因此使用get()方法,而不是返回列表的extract()方法。
  • 当所需的文本位于所选元素的子元素内时,请确保使用>
  • 最后是CSS选择器参考https://www.w3schools.com/cssref/css_selectors.asp

相关问题