替换br标签后的文本消除后的文本

时间:2016-08-04 13:05:53

标签: python beautifulsoup bs4

我正在从网站抓取一些数据并使用BeautifulSoupbs4)遇到问题。我需要获取一些元素的文本,由任何东西(逗号,空格等)分隔,这使我能够按照它出现的顺序拆分文本。

text

bs4.element.Tag属性提供了文字内容。问题是,即使中间有<br>,我也会将文本连接起来。我无法区分OneTwo是一个单词/句子还是多个。

我正在使用find_all查找所有<br>代码,并将其替换为逗号,,以便我可以通过它分割文本。但是,替换br代码似乎会删除br代码后面的文字。

以下是一些可以重现问题的代码:

from bs4 import BeautifulSoup

soup = BeautifulSoup("""
<html>
    <head>
    </head>
    <body>
        <div>
            One
            <br>
            Two
            <br>
            <br>
        </div>
    </body>
</html>
""".replace(' ', '').replace('\n', ''), "html.parser")

print soup.div.text
# Out: OneTwo

for br in soup.find_all('br'):
    br.replace_with(',')

print soup.text.replace('\n', '')
# Out: One,

我希望它打印的是One,TwoOne,Two,,或类似的东西。如何在不删除过程中的其他文本的情况下将br标记替换为字符?

1 个答案:

答案 0 :(得分:0)

嗯,可能有很多方法可以做到这一点,但我想要一个干净的解决方案,适用于现实世界,可能是可怕的HTML。

如果有人来寻找类似问题的解决方案,我偶然发现了一个简洁的方法,insert,这正是我想要的。

from bs4 import BeautifulSoup

soup = BeautifulSoup("""
<html>
    <head>
    </head>
    <body>
        <div>
            One
            <br>
            Two
            <br>
            <br>
        </div>
    </body>
</html>
""".replace(' ', '').replace('\n', ''), "html.parser")

for br in soup.find_all('br'):
    br.insert(0, ',')

print soup.text.replace('\n', '')
# Out: One,Two,,

修改

Padraic Cunningham建议的更好的解决方案是将br的文本连接到替换文件,这将保留原始文本。

from bs4 import BeautifulSoup

soup = BeautifulSoup("""
<html>
    <head>
    </head>
    <body>
        <div>
            One
            <br>
            Two
            <br>
            <br>
        </div>
    </body>
</html>
""".replace(' ', '').replace('\n', ''), "html.parser")

for br in soup.find_all('br'):
    br.replace_with(',' + br.text)

print soup.text.replace('\n', '')
# Out: One,Two