获取div中的纯文本,无标签无特殊字符
我有一个HTML文件,里面有很多不同结构的文本,都是放在div标签里的。我想要做的就是提取这些标签里的文本,但不想要标签、换行符等其他东西。
比如说这个HTML div:
<div class="textNahlad">
<i>Informácie pre záujemcu:</i>
<br>
Výberový pohovor je potrebné vopred dojednať telefonicky
<br>
</div>
它也可能是这样的:
<div class="textNahlad">
<b>Informácie pre záujemcu:</b>
<br>
<br>
<br>
<i>Výberový pohovor je potrebné vopred dojednať telefonicky</i>
<br>
</div>
所以我想要的结果是:Informácie pre záujemcu: Výberový pohovor je potrebné vopred dojednať telefonicky
我想知道在Python/BS4中有没有什么函数可以只返回文本,而不带标签、换行符和其他杂乱的东西。
find.('div',class_="textNahlad")
这个方法不管用。
补充:我试过用.contents来处理每个内容,检查它是文本还是标签,如果是标签就提取文本,但这样做不太有效。
4 个回答
0
我觉得bs4的get_text
方法应该可以正常使用。你可以用一些正则表达式来处理结果,去掉多余的空格。
import re
div = soup.find('div', class_='textNahlad')
text = div.get_text()
# '\nInformácie pre záujemcu:\n\n\n\nVýberový pohovor je potrebné vopred dojednať telefonicky\n\n'
result = re.sub(r'\s+', ' ', text).strip()
# 'Informácie pre záujemcu: Výberový pohovor je potrebné vopred dojednať telefonicky'
0
这样做:
#! /usr/bin/env python
# -*- coding: utf-8 -*-
content = """
<div class="textNahlad">
<b>Informácie pre záujemcu:</b>
<br>
<br>
<br>
<i>Výberový pohovor je potrebné vopred dojednať telefonicky</i>
<br>
</div>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(content)
for string in soup.strings:
if string.strip():
print string.strip(),
0
当然,你真的 应该 使用像 lxml 或 BeautifulSoup 这样的专业解析库来完成这个任务,不过其实用几个正则表达式和字符串方法也能轻松搞定。
#! /usr/bin/env python
# -*- coding: utf_8 -*-
import re
src = '''
<div class="textNahlad">
<i>Informácie pre záujemcu:</i>
<br>
Výberový pohovor je potrebné vopred dojednať telefonicky
<br>
</div>
<div class="textNahlad">
<b>Informácie pre záujemcu:</b>
<br>
<br>
<br>
<i>Výberový pohovor je potrebné vopred dojednať telefonicky</i>
<br>
</div>
'''
flags = re.DOTALL
#Capture div content
pdiv = re.compile(r'<div [^>]*?>(.*?)</div>', flags)
#Find remaining tags
ptag = re.compile(r'<[^>]*?>', flags)
def main():
divs = pdiv.findall(src)
for i, d in enumerate(divs):
parts = [s.strip() for s in ptag.split(d)]
text = ' '.join(s for s in parts if s)
print "%d:\n%s\n" % (i, text)
if __name__ == "__main__":
main()
输出
0:
Informácie pre záujemcu: Výberový pohovor je potrebné vopred dojednať telefonicky
1:
Informácie pre záujemcu: Výberový pohovor je potrebné vopred dojednať telefonicky
这段代码没有处理 HTML 实体,但加上这个功能其实也不难。
1
你可以这样访问 stripped_strings
属性:
from bs4 import BeautifulSoup
html1 = '''<div class="textNahlad">
<i>Informácie pre záujemcu:</i>
<br>
Výberový pohovor je potrebné vopred dojednať telefonicky
<br>
</div>'''
soup1 = BeautifulSoup(html1)
html2 = '''<div class="textNahlad">
<b>Informácie pre záujemcu:</b>
<br>
<br>
<br>
<i>Výberový pohovor je potrebné vopred dojednať telefonicky</i>
<br>
</div>'''
soup2 = BeautifulSoup(html2)
>>> print ' '.join(soup1.stripped_strings)
Informácie pre záujemcu: Výberový pohovor je potrebné vopred dojednať telefonicky
>>> print ' '.join(soup2.stripped_strings)
Informácie pre záujemcu: Výberový pohovor je potrebné vopred dojednať telefonicky
>>> ' '.join(soup1.stripped_strings) == ' '.join(soup2.stripped_strings)
True
最后一行显示,虽然输入中的空白部分(<br>
)不同,但文本内容是一样的。