使用Beautiful Soup从HTML标签中提取文本

0 投票
3 回答
974 浏览
提问于 2025-04-18 09:25

我有一些HTML页面需要提取数据。

我想获取像“Caliper Ring”这样的项目标题。

我正在从包含这个标题的标签中获取数据:

item_title = base_page.find_all('h1', class_='itemTitle')

它包含这样的标签结构:

> [<h1 class="itemTitle"> <div class="l1">Caliper</div>
>                                 Ball
>                             </h1>]

为了提取“Caliper Ball”,我使用了

    collector = []
    for _ in item_title:
        collector.append(_.text)

所以我在收集列表中得到了这样的杂乱输出:

[u"\nCaliper\r\n                                Ball\r\n                            "]

我该如何让输出变得清晰,比如“Caliper Ball”这样?

3 个回答

0

你可以使用 replace() 方法把 \n\r 替换成空字符串或者空格。然后再用 trim() 方法来去掉多余的空格。

0

这个正则表达式可以帮助你得到输出结果(Caliper Ball),

import re
str="""[<h1 class="itemTitle"> <div class="l1">Caliper</div>
                                 Ball 
                             </h1>]"""
regex = r'.*>([^<]*)<\/div>\s*\n\s*(\w*).*'
match = re.findall(regex, str)
new_data = (' '.join(w) for w in match)
print ''.join(new_data) # => Caliper Ball
1

别用 regex(正则表达式)。这样做会让事情变得复杂,实际上你只需要简单的处理。BeautifulSoup4 里已经有一个叫 stripped_strings 的功能,可以直接满足这个需求。看看我下面的代码。

from bs4 import BeautifulSoup as bsoup

html = """[<h1 class="itemTitle"> <div class="l1">Caliper</div>
                               Ball
                           </h1>]"""
soup = bsoup(html)
soup.prettify()

item = soup.find("h1", class_="itemTitle")
base =  list(item.stripped_strings)
print " ".join(base)

结果:

Caliper Ball
[Finished in 0.5s]

解释一下:stripped_strings 这个功能基本上是从你指定的标签里获取所有文本,然后把里面的空格、换行符等都去掉。它返回的是一个生成器,我们可以用 list 把它转成一个列表。变成列表后,就可以用 " ".join 把它们连接起来了。

如果这对你有帮助,记得告诉我们哦。

补充说明:其实在 stripped_strings 的结果上用 list 不是必须的,但这样做可以让结果更清晰明了。

撰写回答