这是我的HTML:
<div class="left_panel">
<h4>Header1</h4>
block of text that I want.
<br />
<br />
another block of text that I want.
<br />
<br />
still more text that I want.
<br />
<br />
<p> </p>
<h4>Header2</h4>
文本块的数量是可变的,Header1
是一致的,Header2
不是。
我使用以下代码成功提取了第一个文本块:
def get_summary (soup):
raw = soup.find('div',{"class":"left_panel"})
for h4 in raw.findAllNext('h4'):
following = h4.nextSibling
return following
但是我需要位于两个h4
标记之间的所有项目,我希望使用h4.nextSiblings
可以解决此问题,但由于某种原因会返回以下错误:
TypeError: 'NoneType' object is not callable
我一直在尝试对这个答案进行修改:Find next siblings until a certain one using beautifulsoup但是缺少一个主要标签让我很困惑。
答案 0 :(得分:2)
找到第一个标题并迭代.next_siblings
,直到您点击另一个标题:
from bs4 import BeautifulSoup
data = """
<div class="left_panel">
<h4>Header1</h4>
block of text that I want.
<br />
<br />
another block of text that I want.
<br />
<br />
still more text that I want.
<br />
<br />
<p> </p>
<h4>Header2</h4>
</div>
"""
soup = BeautifulSoup(data)
header1 = soup.find('h4', text='Header1')
for item in header1.next_siblings:
if getattr(item, 'name') == 'h4' and item.text == 'Header2':
break
print item
更新(在两个h4
标签之间收集文字):
texts = []
for item in header1.next_siblings:
if getattr(item, 'name') == 'h4' and item.text == 'Header2':
break
try:
texts.append(item.text)
except AttributeError:
texts.append(item)
print ''.join(texts)
答案 1 :(得分:1)
我不明白你为什么要通过soup
作为论据,但你不能使用它。
如果你使用正确的汤实例,你不应该得到那个错误。 findAllNext(h4)
返回<h4>Header1</h4>
和<h4>Header2</h4>
,在每个文件上都应用nextSibling
会返回文本兄弟,
block of text that I want.
和
')
在你的情况下。