2014-10-20 99 views
0

我有一个html,div标签中有很多不同的文本结构。我想的唯一的事情,就是让这些标签内的文本,但没有标签,换行等从div获取文本没有任何标签和特殊字符/ Python/

例如这个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做到这一点,并为每个内容检查,无论是文字或标记,如果标签,然后得到文本,但它不能正常工作。

回答

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(), 
+1

这产生了2个HTML样本不同的结果 - 的之间的空格数“záujemcu:”和“Výberový”而变化。你可以使用'''.join(如果s.strip()])'用于's.strings(s.strip()for s.strings')来纠正它,但它很笨拙。 – mhawke 2014-10-20 11:18:56

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' 
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>)是在输入不同的,文字是一样的。

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实体,但是这不是太难的补充。