title: Too many newlines in BeautifulSoup stripped_strings... How to get plain text formatted more closely to original html?
body: <p>Using Python 2.7 and bs4, consider the following HTML snippet:</p>
  
  <pre><code>    &lt;div class="pd-t10"&gt;
          &lt;ul class="bullet-list c-body pd-b20"&gt;
              &lt;li class="mr-t20"&gt;
              &lt;strong&gt;
                &lt;em&gt;Innerhalb Deutschlands&lt;/em&gt;
              &lt;/strong&gt;: 0800 100 6711&lt;/li&gt;
              &lt;li class="mr-t20"&gt;International: Siehe die Liste der 
              &lt;a href="/de/support/contacts/us_support.html" fallback="Auf Englisch" target="new"&gt;geb&amp;#252;hrenfreien Telefonnummern weltweit&lt;/a&gt; von VMware.&lt;/li&gt;
              &lt;li class="mr-t20"&gt;
              &lt;strong&gt;Wichtiger Hinweis:&lt;/strong&gt; Bitte halten Sie Ihre 
              &lt;a href="/de/support/customer-number-faq.html" fallback="Auf Englisch"&gt;Kundennummer&lt;/a&gt; bereit, wenn Sie den Support anrufen. Wenn Sie &amp;#252;ber ein VMware-Konto verf&amp;#252;gen, finden Sie Ihre Kundennummer auf der 
              &lt;a href="/account/secure/customerRegistration.do?action=existingCustomer"&gt;Profilseite&lt;/a&gt;.&lt;/li&gt;
          &lt;/ul&gt;
      &lt;/div&gt;
  </code></pre>
  
  <p>Using .stripped_strings gets the text out, but the format of printing the plain text doesn't match how the text would be displayed in a browser:</p>
  
  <pre><code>for x in foo.stripped_strings:
      print x
  </code></pre>
  
  <p>yields:</p>
  
  <pre><code>Innerhalb Deutschlands
  : 0800 100 6711
  International: Siehe die Liste der
  gebührenfreien Telefonnummern weltweit
  von VMware.
  Wichtiger Hinweis:
  Bitte halten Sie Ihre
  Kundennummer
  bereit, wenn Sie den Support anrufen. Wenn Sie über ein VMware-Konto verfügen, finden Sie Ihre Kundennummer auf der
  Profilseite
  .
  </code></pre>
  
  <p>But what I'd like to see is:</p>
  
  <pre><code>Innerhalb Deutschlands: 0800 100 6711
  International: Siehe die Liste der gebührenfreien Telefonnummern weltweit von VMware.
  Wichtiger Hinweis: Bitte halten Sie Ihre Kundennummer bereit, wenn Sie den Support anrufen. Wenn Sie über ein VMware-Konto verfügen, finden Sie Ihre Kundennummer auf der Profilseite.
  </code></pre>
  
  <p>Is there a clever way to do this that I've missed?  get_text and find_all(text=True) yield similar results...</p>
  
  <p>Adding a little more detail...   Here's the thing that's confusing to me:  it seems like soup objects maintain some memory of tags even after they're removed...</p>
  
  <p>if we use .unwrap() on every tag that isn't <code>&lt;p&gt;</code>, <code>&lt;li&gt;</code>, or <code>&lt;br&gt;</code>, foo becomes:</p>
  
  <pre><code>&lt;div class="pd-t10"&gt;
  
  &lt;li class="mr-t20"&gt;
  
  Innerhalb Deutschlands
  : 0800 100 6711&lt;/li&gt;
  &lt;li class="mr-t20"&gt;International: Siehe die Liste der 
          gebührenfreien Telefonnummern weltweit von VMware.&lt;/li&gt;
  &lt;li class="mr-t20"&gt;
  Wichtiger Hinweis: Bitte halten Sie Ihre 
              Kundennummer bereit, wenn Sie den Support anrufen. Wenn Sie über ein VMware-Konto verfügen, finden Sie Ihre Kundennummer auf der 
              Profilseite.&lt;/li&gt;
  
  &lt;/div&gt;
  </code></pre>
  
  <p>which still doesn't behave the way you'd expect:</p>
  
  <pre><code>[txt for txt in foo.stripped_strings]
  [u'Innerhalb Deutschlands', u': 0800 100 6711', u'International: Siehe die Liste der', u'geb\xfchrenfreien Telefonnummern weltweit', u'von VMware.', u'Wichtiger Hinweis:', u'Bitte halten Sie Ihre', u'Kundennummer', u'bereit, wenn Sie den Support anrufen. Wenn Sie \xfcber ein VMware-Konto verf\xfcgen, finden Sie Ihre Kundennummer auf der', u'Profilseite', u'.']
  </code></pre>
  
  <p>But if we write the unwrapped code to a tempfile, then open that as a new soup object, we get much closer:</p>
  
  <pre><code>[txt for txt in newSoup.stripped_strings]
  [u'Innerhalb Deutschlands\n: 0800 100 6711', u'International: Siehe die Liste der \n            geb\u7aefhrenfreien Telefonnummern weltweit von VMware.', u'Wichtiger Hinweis: Bitte halten Sie Ihre \n            Kundennummer bereit, wenn Sie den Support anrufen. Wenn Sie \u7aefber ein VMware-Konto verf\u7aefgen, finden Sie Ihre Kundennummer auf der \n            Profilseite.']
  </code></pre>
  
  <p>Now it's just a matter of replacing newlines with spaces in each list item and stripping out the extra whitespace (<code>' '.join(listitem.split())</code>).  This gives a solution to the general problem, but it doesn't explain why dumping the string &amp; create a new soup object behaves differently than the existing soup object.</p>