Я пытаюсь собрать содержимое между двумя тегами на одном уровне, в этом случае содержимое между двумя тегами h2
ниже:
<h2 id="learning-outcomes">Learning Outcomes</h2>
<table>
<thead>
<tr class="header">
<th>On successful completion of this unit, you will beable to:</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><ol type="1">
<li><p>Plan for and be active in your own learning...</p></li>
<li><p>Reflect on your knowledge of yourself....</p></li>
<li><p>Articulate your informed understanding of the foundations...</p></li>
<li><p>Demonstrate information literacy skills</p></li>
<li><p>Communicate in writing for an academic audience</p></li>
</ol></td>
</tr>
</tbody>
</table>
<h2 id="prior-knowledge">Prior knowledge</h2>
В идеале, я хотел бы, чтобы выводниже (т. е. в идеале текст в <th>
будет игнорироваться, но я согласен с этим):
Plan for and be active in your own learning...
Reflect on your knowledge of teaching and yourself...
Articulate your informed understanding of the foundations...
Demonstrate information literacy skills
Communicate in writing for an academic audience
Это то, что я имею до сих пор;
soup = BeautifulSoup(text)
output = ""
unitLO = soup.find(id="learning-outcomes")
tagBreak = unitLO.name
if unitLO:
# we will loop until we hit the next tag with the same name as the
# matched tag. eg if unitLO matches an H3, then all content up till the
# next H3 is captured.
for tag in unitLO.next_siblings:
if tag.name == tagBreak:
break
else:
output += str(tag)
print(output)
, который дает следующий вывод, который является строкой;
>>> type(output)
<class 'str'>
>>>
<table>
<thead>
<tr class="header">
<th>On successful completion of this unit, you will beable to:</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><ol type="1">
<li><p>Plan for and be active in your own learning...</p></li>
<li><p>Reflect on your knowledge of yourself....</p></li>
<li><p>Articulate your informed understanding of the foundations...</p></li>
<li><p>Demonstrate information literacy skills</p></li>
<li><p>Communicate in writing for an academic audience</p></li>
</ol></td>
</tr>
</tbody>
</table>
Что несколько отличается от того, что я хочу ...
Единственное решение, которое я придумал, этопротолкнуть output
через очередной раунд анализа BeautifulSoup
:
>>> moresoup = BeautifulSoup(output)
>>> for str in moresoup.strings:
... print(str)
...
On successful completion of this unit, you will beableto:
Plan for and be active in your own learning...
Reflect on your knowledge of yourself....
Articulate your informed understanding of the foundations...
Demonstrate information literacy skills
Communicate in writing for an academic audience
>>>
Что действительно не элегантно и приводит к появлению большого количества пустого пространства (которое, конечно, легко убрать).
Есть какие-нибудь мысли по поводу более элегантного способа сделать это?
Большое спасибо!