TypeError: '_sre.SRE_Match'对象没有'__getitem__'属性

21 投票
2 回答
22540 浏览
提问于 2025-04-17 21:43

我现在遇到了这个错误,但不知道是什么意思。这是一个使用Scrapy的Python项目,我看到的错误是:

  File "/bp_scraper/bp_scraper/httpmiddleware.py", line 22, in from_crawler
    return cls(crawler.settings)
  File "/bp_scraper/bp_scraper/httpmiddleware.py", line 12, in __init__
    if parts[1]:
TypeError: '_sre.SRE_Match' object has no attribute '__getitem__'

代码如下:

import re
import random
import base64
from scrapy import log
class RandomProxy(object):
    def __init__(self, settings):
        self.proxy_list = settings.get('PROXY_LIST')
        f = open(self.proxy_list)

        self.proxies = {}
        for l in f.readlines():
            parts = re.match('(\w+://)(\w+:\w+@)?(.+)', l)

            if parts[1]:
                parts[1] = parts[1][:-1]

            self.proxies[parts[0] + parts[2]] = parts[1]

        f.close()
    @classmethod
    def from_crawler(cls, crawler):
        return cls(crawler.settings)

提前感谢你的帮助!

2 个回答

8

你不能这样访问匹配的结果:

        if parts[1]:
            parts[1] = parts[1][:-1]

应该这样做:

        if parts:
            matched = parts.group(1)[:-1]

关于正则表达式匹配组的更多信息可以在 这里 找到

21

调用 re.match 的结果是一个 SRE_Match 对象,这个对象不支持用 [] 这种方式来访问(也就是不支持 __getitem__)。我想你想要的是

if parts is not None:
    if parts.group(1):
        <blah>

不过,parts.group(1) 是不可变的,也就是说你不能直接修改它,所以你需要再创建一个变量来保存你想要的更改。

撰写回答