在标签之间获取多个文本块
Getting multiple blocks of text between tags
这是我的 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
可以解决这个问题,但由于某些原因 returns 以下错误:
TypeError: 'NoneType' object is not callable
我一直在尝试这个答案的变体:Find next siblings until a certain one using beautifulsoup 但是缺少前导标签让我感到困惑。
我不明白你为什么将 soup
作为参数传递但你不使用它。
如果您使用正确的 soup 实例,则不会出现该错误。 findAllNext(h4)
returns <h4>Header1</h4>
和 <h4>Header2</h4>
,对每个 returns 文本同级应用 nextSibling
,即
block of text that I want.
和
')
你的情况。
找到第一个 header 并遍历 .next_siblings
直到找到另一个 header:
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)
这是我的 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
可以解决这个问题,但由于某些原因 returns 以下错误:
TypeError: 'NoneType' object is not callable
我一直在尝试这个答案的变体:Find next siblings until a certain one using beautifulsoup 但是缺少前导标签让我感到困惑。
我不明白你为什么将 soup
作为参数传递但你不使用它。
如果您使用正确的 soup 实例,则不会出现该错误。 findAllNext(h4)
returns <h4>Header1</h4>
和 <h4>Header2</h4>
,对每个 returns 文本同级应用 nextSibling
,即
block of text that I want.
和
')
你的情况。
找到第一个 header 并遍历 .next_siblings
直到找到另一个 header:
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)