Html 使用beautifulsoup4展开元素:它是否影响父元素的.string?

Html 使用beautifulsoup4展开元素:它是否影响父元素的.string?,html,web-scraping,beautifulsoup,python-3.4,Html,Web Scraping,Beautifulsoup,Python 3.4,我正在web上搜索下表中的文本数据,并希望获得以下结果: Lorem ipsumdolor sit amet奉献精英, 劳工和大型企业的临时投资 aliqua.我们需要一个最低限度的练习 ullamco laboris nisi和aliquip ex ea commodo consequat html='' 乱数假文 多洛 坐阿梅特 献祭精英, 这是临时性的劳动和就业机会。 但是,在最低限度上,我们需要一个实验室来进行日常工作。 ''' 我用beautifulsoup4打开了元素: soup

我正在web上搜索下表中的文本数据,并希望获得以下结果:

Lorem ipsum
dolor sit amet
奉献精英,
劳工和大型企业的临时投资 aliqua.
我们需要一个最低限度的练习 ullamco laboris nisi和aliquip ex ea commodo consequat

html=''
乱数假文
多洛
坐阿梅特
献祭精英,
这是临时性的劳动和就业机会。
但是,在最低限度上,我们需要一个实验室来进行日常工作。
'''
我用beautifulsoup4打开了
元素:

soup = BeautifulSoup(html)

# remove <span> tag but keep content
spans = soup.find_all('span')
for tag in spans:
    tag.unwrap()
soup=BeautifulSoup(html)
#删除标记但保留内容
span=soup.find_all('span'))
对于跨中的标记:
tag.unwrap()
但是,我为所有空
元素提供了空行,或者“dolor sit amet”行不打印,即使我在使用prettify打印html时可以看到它

# text with empty lines
for line in soup.find_all('td'):
    print(line.get_text().strip())
    print(line.string) # line with <span> prints None

# missing line <span>
for line in soup.find_all('td', text=re.compile(r'\w')):
    print(line.get_text().strip())

print(soup.prettify())
#带空行的文本
对于汤中的线。查找所有('td'):
打印(line.get_text().strip())
打印(line.string)#无打印的行
#缺线
对于soup.find_all('td',text=re.compile(r'\w'))中的行:
打印(line.get_text().strip())
打印(soup.prettify())
我做错什么了吗?如何使用unwrap()并在没有空行的情况下仍然访问所有文本内容


谢谢你的帮助

我可以测试一下,你就在附近。应用
strip()
,然后使用
re
模块将多个空格替换为一个空格,如:

from bs4 import BeautifulSoup
import re

html = ''' 
<table>
<tr class="title last ">
  <td>
   Lorem ipsum
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   <span class="caps">dolor
   </span>
   sit amet
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   consectetur adipiscing elit,
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </td>
  <td>
  </td>
 </tr>
</table>
'''

soup = BeautifulSoup(html)

# remove <span> tag but keep content
spans = soup.find_all('span')
for tag in spans:
    tag.unwrap()

print('\n'.join(
  re.sub(r'\s+', ' ', td.text.strip()) 
    for td in soup.find_all('td') if td.text.strip()))

太好了,谢谢!请允许我问一下,
td.text.strip()
td.get_text().strip()
之间有什么区别?为什么
text=re.compile(r'\w')
与“dolor sit amet”的行不匹配?
from bs4 import BeautifulSoup
import re

html = ''' 
<table>
<tr class="title last ">
  <td>
   Lorem ipsum
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   <span class="caps">dolor
   </span>
   sit amet
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   consectetur adipiscing elit,
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
   sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
  </td>
  <td>
  </td>
 </tr>
 <tr>
  <td>
    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
  </td>
  <td>
  </td>
 </tr>
</table>
'''

soup = BeautifulSoup(html)

# remove <span> tag but keep content
spans = soup.find_all('span')
for tag in spans:
    tag.unwrap()

print('\n'.join(
  re.sub(r'\s+', ' ', td.text.strip()) 
    for td in soup.find_all('td') if td.text.strip()))
Lorem ipsum
dolor sit amet
consectetur adipiscing elit,
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.