使用Beautiful Soup从HTML标签中提取文本
我有一些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
不是必须的,但这样做可以让结果更清晰明了。