gpt4 book ai didi

python - 如何摆脱Exceptions.TypeError错误?

转载 作者:行者123 更新时间:2023-11-30 23:17:40 25 4
gpt4 key购买 nike

我正在使用 Scrapy 编写一个爬虫。我希望它做的一件事是比较当前网页的根域和其中链接的根域。如果该域不同,则必须继续提取数据。这是我当前的代码:

class MySpider(Spider):
name = 'smm'
allowed_domains = ['*']
start_urls = ['http://en.wikipedia.org/wiki/Social_media']
def parse(self, response):
items = []
for link in response.xpath("//a"):
#Extract the root domain for the main website from the canonical URL
hostname1 = link.xpath('/html/head/link[@rel=''canonical'']').extract()
hostname1 = urlparse(hostname1).hostname
#Extract the root domain for thelink
hostname2 = link.xpath('@href').extract()
hostname2 = urlparse(hostname2).hostname
#Compare if the root domain of the website and the root domain of the link are different.
#If so, extract the items & build the dictionary
if hostname1 != hostname2:
item = SocialMediaItem()
item['SourceTitle'] = link.xpath('/html/head/title').extract()
item['TargetTitle'] = link.xpath('text()').extract()
item['link'] = link.xpath('@href').extract()
items.append(item)
return items

但是,当我运行它时,我收到此错误:

Traceback (most recent call last):
File "C:\Anaconda\lib\site-packages\twisted\internet\base.py", line 1201, in mainLoop
self.runUntilCurrent()
File "C:\Anaconda\lib\site-packages\twisted\internet\base.py", line 824, in runUntilCurrent
call.func(*call.args, **call.kw)
File "C:\Anaconda\lib\site-packages\twisted\internet\defer.py", line 382, in callback
self._startRunCallbacks(result)
File "C:\Anaconda\lib\site-packages\twisted\internet\defer.py", line 490, in _startRunCallbacks
self._runCallbacks()
--- <exception caught here> ---
File "C:\Anaconda\lib\site-packages\twisted\internet\defer.py", line 577, in _runCallbacks
current.result = callback(current.result, *args, **kw)
File "E:\Usuarios\Daniel\GitHub\SocialMedia-Web-Scraper\socialmedia\socialmedia\spiders\SocialMedia.py", line 16, in parse
hostname1 = urlparse(hostname1).hostname
File "C:\Anaconda\lib\urlparse.py", line 143, in urlparse
tuple = urlsplit(url, scheme, allow_fragments)
File "C:\Anaconda\lib\urlparse.py", line 176, in urlsplit
cached = _parse_cache.get(key, None)
exceptions.TypeError: unhashable type: 'list'

谁能帮我解决这个错误?我认为这与列表键有关,但我不知道如何解决。非常感谢您!

丹尼

最佳答案

这里有一些问题:

  1. 无需在循环中计算 hostname1,因为它始终选择相同的 rel 元素,即使在子选择器上使用(由于xpath 表达式的性质,它是绝对的而不是相对的,但这是您需要的方式)。

  2. hostname1 的 xpath 表达式格式错误并且返回 None,因此在尝试仅获取 Kevin 提出的第一个元素时会出现错误。表达式中有两个单引号,而不是一个转义单引号或双引号。

  3. 当您应该获取其 @href 属性时,您正在获取 rel 元素本身。应更改 XPath 表达式以反射(reflect)这一点。

解决这些问题后,代码可能如下所示(未经测试):

    def parse(self, response):
items = []
hostname1 = response.xpath("/html/head/link[@rel='canonical']/@href").extract()[0]
hostname1 = urlparse(hostname1).hostname

for link in response.xpath("//a"):
hostname2 = (link.xpath('@href').extract() or [''])[0]
hostname2 = urlparse(hostname2).hostname
#Compare and extract
if hostname1 != hostname2:
...
return items

关于python - 如何摆脱Exceptions.TypeError错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27231751/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com