从div获取文本,没有任何标签和特殊字符/ Python /

时间:2014-10-20 10:43:24

标签: python html beautifulsoup

我有一个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 :(得分: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>)不同,但文本是相同的。

答案 1 :(得分: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(),

答案 2 :(得分:0)

我认为bs4&#39; 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'

答案 3 :(得分: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实体,但这并不难添加。