如何从 HTML 数据中获取文本?

How to get the text from HTML data?

如何在使用 python 3 和 beautifulsoup 4 时获得所有具有相同排列的文本。我尝试了 for 循环,但没有成功。

from bs4 import BeautifulSoup

data = """
<body>
    <div id="Select">
        <h1 id="wall">
            First
        </h1>
    </div>

    </div>
        <div id="color_acts">
        <p id="acts_h">
        Choose
        </p>
        <p id="actshead">
        Color
        </p>
        <p id="acts">
        Blue
        </p>
    </div>

    <div id="Select">
        <h1 id="wall">
            Second
        </h1>
    </div>
    </div>
        <div id="color_acts">
        <p id="acts_h">
        Choose
        </p>
        <p id="actshead">
        Color
        </p>
        <p id="acts">
        Green
        </p>
    </div>
</body>
"""

soup = BeautifulSoup(data, "html.parser")

for Colors in soup.find_all('div', id='Select'):
    CC = Colors.find('h1').text
    print(CC)
    SS = soup.find('div', id='color_acts')
    print(SS)

我的输出:

            First

<div id="color_acts">
<p id="acts_h">
        Choose
        </p>
<p id="actshead">
        Color
        </p>
<p id="acts">
        Blue
        </p>
</div>

            Second

<div id="color_acts">
<p id="acts_h">
        Choose
        </p>
<p id="actshead">
        Color
        </p>
<p id="acts">
        Blue
        </p>
</div>

我的预期输出:

    First

Choose
Color
Blue

    Second

Choose
Color
Green

请注意,我的预期输出先是蓝色然后是绿色,但实际输出只有蓝色两次。如何使输出具有正确的颜色并防止打印 html 标签?

首先,您的问题是您只是使用 soup.find 获取 ID 为 'color_acts' 的第一个 div,这意味着它一直在寻找第一个 div.它永远不会以这种方式获取第二个,因此您只需将蓝色作为颜色两次。你应该循环 zip(soup.find_all('div', id='Select'), soup.find_all('div', id='color_acts'))。这样做的意思是,您将找到所有 ID 为 'Select' 和 'color_acts' 的 div 并同时遍历它们。然后您可以一起访问每个 div 并从中打印,如下所示:

for header, body in zip(soup.find_all('div', id='Select'),
                        soup.find_all('div', id='color_acts')):

现在,关于删除标签信息。您在第一种情况下调用 .text,但在第二种情况下不调用。您之前可能遇到 .text 的问题,但现在您有了 div 我们可以打印出 body.text:

for header, body in zip(soup.find_all('div', id='Select'),
                        soup.find_all('div', id='color_acts')):
        print (header.find('h1').text)
        print (body.text)

你可能会像我一样得到不必要的空格,但你可以只使用 split 用空格分隔单词,然后使用 '\n'.join 将它作为一个字符串重新加入:

        print ('\n'.join(body.text.split()))