太多的新行在beautifulsoupstripped\u strings。。。如何使纯文本格式更接近原始html?

2024-09-30 08:20:25 发布

您现在位置:Python中文网/ 问答频道 /正文

使用Python 2.7和bs4,请考虑以下HTML片段:

    <div class="pd-t10">
        <ul class="bullet-list c-body pd-b20">
            <li class="mr-t20">
            <strong>
              <em>Innerhalb Deutschlands</em>
            </strong>: 0800 100 6711</li>
            <li class="mr-t20">International: Siehe die Liste der 
            <a href="/de/support/contacts/us_support.html" fallback="Auf Englisch" target="new">geb&#252;hrenfreien Telefonnummern weltweit</a> von VMware.</li>
            <li class="mr-t20">
            <strong>Wichtiger Hinweis:</strong> Bitte halten Sie Ihre 
            <a href="/de/support/customer-number-faq.html" fallback="Auf Englisch">Kundennummer</a> bereit, wenn Sie den Support anrufen. Wenn Sie &#252;ber ein VMware-Konto verf&#252;gen, finden Sie Ihre Kundennummer auf der 
            <a href="/account/secure/customerRegistration.do?action=existingCustomer">Profilseite</a>.</li>
        </ul>
    </div>

使用.stripped_字符串可以将文本输出,但打印纯文本的格式与文本在浏览器中的显示方式不匹配:

^{pr2}$

产量:

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
.

但我想看到的是:

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.

有没有一个我错过的聪明方法?得到相似的结果。。。在

添加更多细节。。。这里有一件事让我困惑:似乎soup对象即使在移除标签之后也会保留一些标签的记忆。。。在

如果我们对不是<p><li>或{}的每个标记使用.unwrap(),foo将变成:

<div class="pd-t10">

<li class="mr-t20">

Innerhalb Deutschlands
: 0800 100 6711</li>
<li class="mr-t20">International: Siehe die Liste der 
        gebührenfreien Telefonnummern weltweit von VMware.</li>
<li class="mr-t20">
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.</li>

</div>

它的行为仍然不像你期望的那样:

[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'.']

但是,如果我们将未包装的代码写入tempfile,然后将其作为一个新的soup对象打开,我们将更接近:

[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.']

现在只需要在每个列表项中用空格替换换行符并去掉多余的空格(' '.join(listitem.split()))。这_为_一般_问题_提供_了_一_个_解决_方案_ , _但_不能_解释_为什么_转储_字符串_和_创建_新_的_soup_对象_的_行为_与_现有_的_soup_对象_的_行为_不同_ 。_在


Tags: liclassvmwaremrinternationalderdieliste
1条回答
网友
1楼 · 发布于 2024-09-30 08:20:25

我从不把整篇课文擦掉。但一直都很具体。在

但是既然你必须按照你要求的方式去做,那么我会使用下面的简单工具来得到正确的解决方案。在

请记住,我在这里假设数据总是采用这种格式a:b,就像Innerhalb Deutschlands: 0800 100 6711

所以我要对你的html做些什么

soup=BeautifulSoup(html)
text=soup.text.replace("\n:",":").replace("\n "," ")
text=text.split("\n")
text=filter(None, text) # This is to remove the empty elements
text=[" ".join(c.split()) for c in text] # To remove the extra whitespaces
for i in text:
    print i

Out[46]:
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.

希望有帮助:-)

相关问题 更多 >

    热门问题