Python 3.x 如何使用Python和Beautiful Soup修复html列表片段中缺少的ul标记
如果我有这样一段html:Python 3.x 如何使用Python和Beautiful Soup修复html列表片段中缺少的ul标记,python-3.x,beautifulsoup,html-lists,Python 3.x,Beautifulsoup,Html Lists,如果我有这样一段html: <p><br><p> <li>stuff</li> <li>stuff</li> 东西 东西 有没有一种方法可以清理这个问题,并使用或其他python库添加缺少的ul/ol标记 我尝试了soup.prettify(),但它没有改变。首先,您必须决定要使用哪个解析器。不同的解析器处理格式错误的html 以下BeautifulSoup方法将帮助您完成所需的任务 -创建一个新的ul标
<p><br><p>
<li>stuff</li>
<li>stuff</li>
东西
东西
有没有一种方法可以清理这个问题,并使用或其他python库添加缺少的ul/ol标记
我尝试了
soup.prettify()
,但它没有改变。首先,您必须决定要使用哪个解析器。不同的解析器处理格式错误的html
以下BeautifulSoup方法将帮助您完成所需的任务
- -创建一个新的
标签ul
- -将新创建的ul标签附加到汤树中的某个位置
- -逐个提取
标签(我们可以将其附加到li
标签)ul
- -从树中删除任何不需要的标记。这可能是解析器对格式错误的html进行解释的结果
html5lib
解析器创建一个soup对象,看看我们得到了什么
from bs4 import BeautifulSoup
html="""
<p><br><p>
<li>stuff</li>
<li>stuff</li>
"""
soup=BeautifulSoup(html,'html5lib')
print(soup)
产出:
<html><head></head><body><p><br/></p><p>
</p><li>stuff</li>
<li>stuff</li>
</body></html>
<html>
<head>
</head>
<body>
<p>
<br/>
</p>
<ul>
<li>
stuff
</li>
<li>
stuff
</li>
</ul>
</body>
</html>
-
东西
-
东西
似乎没有一种内置方法将li
元素组包装成ul
。但是,您可以简单地在li
元素上循环,识别每个li
组的第一个元素,并将其包装在ul
标记中。组中的下一个元素附加到先前创建的ul
:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
ulgroup = 0
uls = []
for li in soup.findAll('li'):
previous_element = li.findPrevious()
# if <li> already wrapped in <ul>, do nothing
if previous_element and previous_element.name == 'ul':
continue
# if <li> is the first element of a <li> group, wrap it in a new <ul>
if not previous_element or previous_element.name != 'li':
ulgroup += 1
ul = soup.new_tag("ul")
li.wrap(ul)
uls.append(ul)
# append rest of <li> group to previously created <ul>
elif ulgroup > 0:
uls[ulgroup-1].append(li)
print(soup.prettify())
从bs4导入美化组
soup=BeautifulSoup(html,“html.parser”)
ulgroup=0
uls=[]
给汤里的李。芬德尔(‘李’):
previous_元素=li.findPrevious()
#如果已包装在中,请不要执行任何操作
如果前一个_元素和前一个_元素.name=='ul':
继续
#如果- 是
- 组的第一个元素,则用新的
如果不是上一个元素或上一个元素.name!='李':
ulgroup+=1
ul=汤。新标签(“ul”)
包装纸(ul)
附加uls(ul)
#将- 组的其余部分附加到先前创建的
elif ulgroup>0:
uls[ulgroup-1]。追加(li)
打印(soup.prettify())
例如,以下输入:
html = '''
<p><br><p>
<li>stuff1</li>
<li>stuff2</li>
<div></div>
<li>stuff3</li>
<li>stuff4</li>
<li>stuff5</li>
'''
html=''
材料1
材料2
物品3
物品4
物品5
'''
产出:
<p>
<br/>
<p>
<ul>
<li>
stuff1
</li>
<li>
stuff2
</li>
</ul>
<div>
</div>
<ul>
<li>
stuff3
</li>
<li>
stuff4
</li>
<li>
stuff5
</li>
</ul>
</p>
</p>
-
材料1
-
材料2
-
物品3
-
物品4
-
物品5
演示:如果第一个元素是
<p>
<br/>
<p>
<ul>
<li>
stuff1
</li>
<li>
stuff2
</li>
</ul>
<div>
</div>
<ul>
<li>
stuff3
</li>
<li>
stuff4
</li>
<li>
stuff5
</li>
</ul>
</p>
</p>