我正在从网站抓取一些数据并使用BeautifulSoup
(bs4
)遇到问题。我需要获取一些元素的文本,由任何东西(逗号,空格等)分隔,这使我能够按照它出现的顺序拆分文本。
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,Two
或One,Two,,
或类似的东西。如何在不删除过程中的其他文本的情况下将br
标记替换为字符?
答案 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