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