在Python中去除HTML标签获取字符串

2 投票
3 回答
1563 浏览
提问于 2025-04-18 01:43

我尝试用BeautifulSoup从一个HTML文件中提取一些字符串,但每次操作时得到的结果总是不完整。

我想获取每个li元素或标签中的字符串。到目前为止,我已经能像这样获取ul中的所有内容。

#!/usr/bin/python
from bs4 import BeautifulSoup
page = open("page.html")
soup = BeautifulSoup(page)
source = soup.select(".sidebar li")

而我得到的结果是这样的:

[<li class="first">
        Def Leppard -  Make Love Like A Man<span>Live</span> </li>, <li>
        Inxs - Never Tear Us Apart        </li>, <li>
        Gary Moore - Over The Hills And Far Away        </li>, <li>
        Linkin Park -  Numb        </li>, <li>
        Vita De Vie -  Basul Si Cu Toba Mare        </li>, <li>
        Nazareth - Love Hurts        </li>, <li>
        U2 - I Still Haven't Found What I'm L        </li>, <li>
        Blink 182 -  All The Small Things        </li>, <li>
        Scorpions -  Wind Of Change        </li>, <li>
        Iggy Pop - The Passenger        </li>]

我只想获取这些字符串。

3 个回答

0

这个例子来自于文档,它提供了一个非常简洁的一行代码。

''.join(BeautifulSoup(source).findAll(text=True))
1

遍历结果并获取 text 属性的值:

for element in soup.select(".sidebar li"):
    print element.text

示例:

from bs4 import BeautifulSoup


data = """
<body>
    <ul>
        <li class="first">Def Leppard -  Make Love Like A Man<span>Live</span> </li>
        <li>Inxs - Never Tear Us Apart        </li>
    </ul>
</body>
"""

soup = BeautifulSoup(data)
for element in soup.select('li'):
    print element.text

输出:

Def Leppard -  Make Love Like A ManLive 
Inxs - Never Tear Us Apart        
2

可以使用Beautiful Soup的.strings方法。

for string in soup.stripped_strings:
print(repr(string))

根据文档:

如果一个标签里面有多个内容,你仍然可以只查看这些内容的字符串。可以使用.strings生成器:

或者

这些字符串通常会有很多多余的空格,你可以使用.stripped_strings生成器来去掉这些空格:

撰写回答