Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 循环参考号在哪里?_Python_Json_Object_Serialization - Fatal编程技术网

Python 循环参考号在哪里?

Python 循环参考号在哪里?,python,json,object,serialization,Python,Json,Object,Serialization,我正在编写一些python类,希望将其编码为JSON。当我尝试jsonify我的对象时,我得到一个提到“循环引用”的错误。我想我理解循环引用的含义,但在我的代码中找不到任何示例 对象之间的关系(具有/是a) 注册有一个 注册人有 地址 代码(python): 我的施工人员搞砸了吗?我是否传递了不应该传递的内容?可能的原因是cell.contents[0]返回的是复杂的BeautifulSoup对象,而不是纯文本。BeautifulSoup对象知道它们的父对象、同级对象、解析器类、属性以及其他

我正在编写一些python类,希望将其编码为JSON。当我尝试jsonify我的对象时,我得到一个提到“循环引用”的错误。我想我理解循环引用的含义,但在我的代码中找不到任何示例

对象之间的关系(具有/是a)
  • 注册有一个
  • 注册人有
  • 地址
代码(python):
我的施工人员搞砸了吗?我是否传递了不应该传递的内容?

可能的原因是
cell.contents[0]
返回的是复杂的BeautifulSoup对象,而不是纯文本。BeautifulSoup对象知道它们的父对象、同级对象、解析器类、属性以及其他可能共享或循环的对象

元素包含内部html时,就会出现这种情况。这在表格中很常见(例如,表格条目可能是粗体或斜体)

您的问题的一个可能解决方案是确保使用BeautifulSoup的
.text
,以确保您只获取文本而不是内部BeautifulSoup元素:

columns = [col.text for col in row.findAll('td')] 
FWIW,这里有一个简单的诊断技术,看看到底发生了什么。只需修改json.dumps()中的默认函数,使其输出可见:

def view_dict(obj):
    print '--------------'
    print 'Type:', obj.__class__
    d = obj.__dict__
    pprint.pprint(d)
    return d

json.dumps(scrape(br), default=view_dict)

循环引用应该立即弹出。希望这能解开谜团(因为否则您的代码看起来很好,并且没有显式地创建循环引用)。

我找不到错误,所以我重构为使用命名元组(Credit@metatoaster)。重新分解解决了这个问题

def scrape(br):
    signups = []

    soup = libStuff.getSoup(br, 'http://thepaintmixer.com/admin/viewdailysignups.php')

    table = soup.find(id='Calendar')
    rows = table.find_all('tr')
    rowNumber = 0
    for row in rows:
        if rowNumber == 0:
            rowNumber = rowNumber + 1
            continue
        cells = row.find_all('td')
        cells = [cell.string if cell.string != None else '' for cell in cells]
        signup = Signup(*cells)
        signups.append(signup)
    return signups

你只是展示了这些课程,而不是你在用它们做什么。请给出一个简单的例子,说明你是如何使用类和生成什么错误的。@布伦巴恩好,但是它有很多代码,然后做一个更小的,更简单的例子,它仍然说明问题。问题是,我不知道问题在哪里,所以我不知道我能删除什么。@ MACSJ200考虑使用来表示你的数据。所有这些复制/粘贴操作都会使您对解决方案的搜索变得复杂,并使我们无法获得您的帮助。您至少应该在另一个答案中运行诊断,以确认实际原因。这样,这个问题和答案将对其他人有用。FWIW,实际修复可能是
.string
部分。其他的更改是不错的代码改进,但与循环引用无关。
def scrape(br):
    signups = []

    soup = libStuff.getSoup(br, 'http://thepaintmixer.com/admin/viewdailysignups.php')

    table = soup.find(id='Calendar')
    rows = table.find_all('tr')
    rowNumber = 0
    for row in rows:
        if rowNumber == 0:
            rowNumber = rowNumber + 1
            continue
        cells = row.find_all('td')
        cells = [cell.string if cell.string != None else '' for cell in cells]
        signup = Signup(*cells)
        signups.append(signup)
    return signups