Python yield生成grid-container HTML时引号冲突问题求解
问题解答
不需要更换yield实现方式,你遇到的问题和yield语法本身无关,是Python字符串的引号嵌套规则导致的语法错误,完全可以在保留yield逐段返回逻辑的前提下解决。
错误原因
你写的这行代码:
yield "<div class="grid-container">".encode('utf-8')
Python解析时会把第二个双引号识别为字符串的结束边界,也就是把"<div class="判定为完整字符串,后面的grid-container">会被当成无效语法直接报错,和外层用了yield没有关系。
可行修复方案
选任意一种即可,都是保留yield逻辑的写法:
- 方案1(最推荐,写法最简洁):外层字符串改用单引号包裹,HTML属性保留双引号,Python中单引号、双引号定义字符串的效果完全一致,不会出现嵌套冲突:
yield '<div class="grid-container">'.encode('utf-8') - 方案2:保留外层双引号,对字符串内部的双引号用反斜杠转义,缺点是转义符多了可读性差:
yield "<div class=\"grid-container\">".encode('utf-8') - 方案3:用三引号包裹HTML片段,后续如果要写多行grid相关的标签、内联样式时更方便,三引号内部可以自由使用单、双引号无需转义:
yield """<div class="grid-container">""".encode('utf-8')
额外注意
你当前代码里grid容器内部还是用的<tr>/<td>/<th>这类表格专属子标签,这类标签只能作为<table>的子元素存在,直接放在grid容器里会出现渲染异常,记得替换成对应网格项的div标签,否则就算容器标签修复了,grid布局也无法正常生效。另外你现有代码漏写了grid容器的闭合标签,补全后才能正常渲染。
修正后参考代码
yield '<div class="grid-container">'.encode('utf-8') for div in soup.findAll('div', attrs={'class':"col-md-10"}): # 原tr标签替换为grid行容器 yield '<div class="grid-row">'.encode('utf-8') for name in div.findAll('div', attrs={'name':"label-Address"}): # 原td标签替换为grid单元格项 yield '<div class="grid-item">{}</div>'.format(name.text).encode('utf-8') yield '</div>'.encode('utf-8') yield '<div class="grid-row">'.encode('utf-8') for name in div.findAll('div', attrs={'name':"label-ScheduledDate"}): yield '<div class="grid-item">{}</div>'.format(name.text).encode('utf-8') yield '</div>'.encode('utf-8') yield '<div class="grid-row">'.encode('utf-8') for name in div.findAll('div', attrs={'name':"label-CaseNumber"}): # 原th的表头样式可以单独给grid-item加对应class实现 yield '<div class="grid-item grid-header">{}</div>'.format(name.text).encode('utf-8') yield '</div>'.encode('utf-8') # 补上grid容器的闭合标签 yield '</div>'.encode('utf-8')
内容的提问来源于stack exchange,提问作者john
相关产品推荐
相关产品推荐

