我有一些我正在使用BeautifulSoup解析的HTML代码。其中一个要求是标签不嵌套在段落或其他文本标签中。
例如,如果我有这样的代码:
<p>
first text
<a href="...">
<img .../>
</a>
second text
</p>
我需要把它变成这样的东西:
<p>first text</p>
<img .../>
<p>second text</p>
我已经做了一些事情来提取图像并在段落之后添加它们,如下所示:
for match in soup.body.find_all(True, recursive=False):
try:
for desc in match.descendants:
try:
if desc.name in ['img']:
if (hasattr(desc, 'src')):
# add image as an independent tag
tag = soup.new_tag("img")
tag['src'] = desc['src']
if (hasattr(desc, 'alt')):
tag['alt'] = desc['alt']
else
tag['alt'] = ''
match.insert_after(tag)
# remove image from its container
desc.extract()
except AttributeError:
temp = 1
except AttributeError:
temp = 1
我已经编写了另一段删除空元素的代码(比如删除其图像后留空的标记),但我不知道如何将元素拆分为两个不同的元素。
答案 0 :(得分:1)
import string
the_string.split(the_separator[,the_limit])
这会产生一个数组,所以你可以通过for循环或者手动获取元素。
在你的情况下,我认为the_separator需要是“\ n” 但这取决于具体情况。解析非常有趣,但有时候很难做到。
答案 1 :(得分:-1)
from bs4 import BeautifulSoup as bs
from bs4 import NavigableString
import re
html = """
<div>
<p> <i>begin </i><b>foo1</b><i>bar1</i>SEPATATOR<b>foo2</b>some text<i>bar2 </i><b>end </b> </p>
</div>
"""
def insert_tags(parent,tag_list):
for tag in tag_list:
if isinstance(tag, NavigableString):
insert_tag = s.new_string(tag.string)
parent.append(insert_tag)
else:
insert_tag = s.new_tag(tag.name)
insert_tag.string = tag.string
parent.append(insert_tag)
s = bs(html)
p = s.find('p')
print s.div
m = re.match(r"^<p>(.*?)(SEPATATOR.*)</p>$", str(p))
part1 = m.group(1).strip()
part2 = m.group(2).strip()
part1_p = s.new_tag("p")
insert_tags(part1_p,bs(part1).contents)
part2_p = s.new_tag("p")
insert_tags(part2_p,bs(part2).contents)
s.div.p.replace_with(part2_p)
s.div.p.insert_before(part1_p)
print s.div
与我合作正常,因为我没有为此目的使用嵌套HTML。不可否认,它仍然看起来很尴尬。它在我的例子中产生
<div>
<p><i>begin </i><b>foo1</b><i>bar1</i></p>
<p>SEPATATOR<b>foo2</b>some text<i>bar2 </i><b>end </b></p>
</div>