我有一个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和每个内容检查,无论是文本还是标记,如果是标记,然后获取文本,但它无法正常工作。
答案 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实体,但这并不难添加。