【问题标题】:How to get the text from HTML data?如何从 HTML 数据中获取文本?
【发布时间】:2015-11-10 11:14:32
【问题描述】:

如何在使用 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 标签?

【问题讨论】:

  • 您的意思是要打印正确的颜色吗?您的输出有两次蓝色,您的预期输出有蓝色然后是绿色。还是您的意思是要从打印件中删除 HTML 标记?
  • 两者。删除 HTML 标签并获得正确的输出

标签: python python-3.x text beautifulsoup bs4


【解决方案1】:

首先,您的问题是您只是使用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()))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-18
    • 2015-11-12
    • 1970-01-01
    • 2013-07-26
    • 2016-06-30
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多