获取div中的纯文本,无标签无特殊字符

0 投票
4 回答
2104 浏览
提问于 2025-04-28 12:43

我有一个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>)不同,但文本内容是一样的。

撰写回答