如何用Beautiful Soup取得两个标签间的所有内容?

<h4>描述1</h4>

<p>text</p>
<p>text</p>
<p>text</p>

<h4>描述2</h4>

<p>text</p>
<p>text</p>
<p>text</p>
<span>asdf</span>

<h4>描述3</h4>

<pre>
4
1
1
2
2</pre>
<p>text</p>

<h4>描述4</h4>

<p>text</p>
<pre>
1
2</pre>

HTML代码如上,如何取得两个<h4>之间的内容?如:

  • 第一次要取得“描述1”和“描述2”之间的所有内容
  • 第二次要取得“描述2”和“描述3”之间的所有内容
阅读 7k
2 个回答

r = requests.get(url,headers=headers)
html = r.text
soup = BeautifulSoup(,'html.parser')
result1 = soup.find_all('h4')[0:1]
result2 = soup.find_all('h4')[1:2]

假设所有 h4 标签是同级, 你可以调用 next_siblings 枚举它的所有同级元素, 如

# -*- coding: utf-8 -*-
from bs4 import BeautifulSoup

html_doc = '''
<html>
    <body>
        <h4>描述1</h4>
        <p>p1.1</p>
        <p>p1.2</p>

        <h4>描述2</h4>
        <p>p2.1</p>
        <p>p2.2</p>
        <span>span2.1</span>
    </body>
</html>
'''
soup = BeautifulSoup(html_doc, 'html.parser')
all_h4 = soup.select('h4')
for h4 in all_h4:
    print('====')
    print(f'{h4!r}')
    for sibling in h4.next_siblings:
        if sibling in all_h4:
            break
        print(f'  {sibling!r}')

输出结果

====
<h4>描述1</h4>
  '\n'
  <p>p1.1</p>
  '\n'
  <p>p1.2</p>
  '\n'
====
<h4>描述2</h4>
  '\n'
  <p>p2.1</p>
  '\n'
  <p>p2.2</p>
  '\n'
  <span>span2.1</span>
  '\n'
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进