我想在Python中使用BeautifulSoup来解析来自这样的html
的html<p><b>Background</b><br />x0</p><p>x1</p>
<p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
<p><b>Activities</b><br />x5</p><p>x6</p>"
到这个结果:
Background: x0, x1
Innovation: x2, x3, x4
Activities: x5, x6
我已经厌倦了使用下面的python脚本:
from bs4 import BeautifulSoup
htmltext = "<p><b>Background</b><br />x0</p><p>x1</p>
<p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
<p><b>Activities</b><br />x5</p><p>x6</p>"
html = BeautifulSoup(htmltext)
for n in html.find_all('b'):
title_name = n.next_element
title_content = n.nextSibling.nextSibling
print title_name, title_content
然而,我只能得到这个:
Background: x0
Innovation: x2
Activities: x5
欢迎您提出意见,我们将非常感谢您的建议。
答案 0 :(得分:2)
在<p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
中,您将转到<b>
元素并找到x2
以为next_element
。这一切都很好。但要找到x3
和x4
,首先需要将元素层次结构上升到封闭的<p>
元素,然后从那里找到包含<p>
的{{1}}个x3
}和x4
。
答案 1 :(得分:1)
我对beautifulsoup很新,但这对我有用:
import bs4
from bs4 import BeautifulSoup
htmls = """<p><b>Background</b><br />x0</p><p>x1</p>
<p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
<p><b>Activities</b><br />x5</p><p>x6</p>"""
html = BeautifulSoup(htmls)
for n in html.find_all('b'):
title_name = n.next_element
title_content = n.nextSibling.nextSibling
results = [title_content]
for f in n.parent.find_next_siblings():
el = f.next_element
if isinstance(el, bs4.element.Tag) and el.name == 'b':
break
results.append(el)
print title_name, results
结果:
Background [u'x0', u'x1']
Innovation [u'x2', u'x3', u'x4']
Activities [u'x5', u'x6']
我选择使用isinstance(el, bs4.element.Tag) and el.name == 'b'
作为分隔符,因为在您的示例中,您尝试捕获的<p>
代码没有子代。根据您要解析的真实网页,这部分可能会略有不同。
答案 2 :(得分:0)
在您再阅读一个标签后,您需要继续停止,直到您点击下一个<b>
为止。 nextSibiling
无法正常工作,因为您解析的<p>
不是<b>
的兄弟姐妹。尝试这样的事情:
def in_same_section(n):
try:
return n.next_element.name != u'b'
except AttributeError:
return True
from bs4 import BeautifulSoup
htmltext ='''<p><b>Background</b><br />x0</p><p>x1</p>
<p><b>Innovation</b><br />x2</p><p>x3</p><p>x4</p>
<p><b>Activities</b><br />x5</p><p>x6</p>'''
html = BeautifulSoup(htmltext)
for n in html.find_all('b'):
title_name = n.string
title_content = []
while in_same_section(n):
n = n.next_element
try:
if n.name == u'p':
title_content += n.string
except AttributeError:
pass
编辑:修复了AttributeError,我想?我在工作,无法测试此代码。