如何解决使用Python Scrapy抓取BBC遇到麻烦
我正在尝试从BBC科学页面上抓取文章标题和摘要,但始终收到TypeError。试图异常处理它没有运气。
我的代码在这里:
import scrapy
from scrapy.crawler import CrawlerProcess
class BBCScienceSpider(scrapy.Spider):
name = "bbc_science_spider"
def start_requests(self):
url = 'https://www.bbc.co.uk/news/science_and_environment'
yield scrapy.Request(url=url,callback=self.parse)
def parse(self,response):
headline = response.xpath("//h3[contains(@class,'gs-c-promo-heading')]/text()").extract()
introduction = response.xpath("//p[contains(@class,'gs-c-promo-summary')]/text()").extract()
bbc_sci_dict[headline] = introduction
bbc_sci_dict = dict()
process = CrawlerProcess()
process.crawl(BBCScienceSpider)
process.start()
print(bbc_sci_dict)
我得到的错误是:
2020-08-23 23:03:20 [scrapy.core.engine] DEBUG: Crawled (200) <GET https://www.bbc.co.uk/news/science_and_environment> (referer: None)
2020-08-23 23:03:20 [scrapy.core.scraper] ERROR: Spider error processing <GET https://www.bbc.co.uk/news/science_and_environment> (referer: None)
Traceback (most recent call last):
File "C:\ProgramData\Anaconda3\envs\pythonProject\lib\site-packages\twisted\internet\defer.py",line 654,in _runCallbacks
current.result = callback(current.result,*args,**kw)
File "C:/Users/tonyr/PycharmProjects/pythonProject/main.py",line 17,in parse
bbc_sci_dict[headline] = introduction
TypeError: unhashable type: 'list'
任何建议都将受到欢迎。谢谢。
解决方法
extract
方法返回一个列表。 List无法散列,因此不能用作字典的键。
headline = response.xpath("//h3[contains(@class,'gs-c-promo-heading')]/text()").extract()
...
bbc_sci_dict[headline] = introduction
您或者需要使用.get()
方法而不是.extract()
(这将返回列表中第一项的字符串),或者选择列表中的一项作为键进行匹配,例如:
bbc_sci_dict[headline[0]] = introduction
,
Select t.PartNumber,t.CompanyName,pc.FamilyName,t.Status
from #TempPC t outer apply
(select pc.*
from [PC].FN_PartCheck_Test( t.[PartNumber],1,t.CompanyId) pc
where pc.GroupID > -2 And pc.PortionID > -2
) pc ;
返回一个列表。如果您的xpath返回单个匹配项,则可以使用extract()
来返回第一个匹配项的实际文本。
extract_first()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。