5

我在 Python 下使用 BeautifulSoup 进行相当多的数据抓取和清理,并且经常附加.text.strip()到 soup.find 命令。例子:foo_stuff = soup.find("foo").text.strip()

在某些情况下, asoup.find什么也找不到,因此.text.strip()会中断。如我所见,我可以通过以下几种方式处理:

  • 编写.find总是返回一些东西的查询——我不是一个足够聪明的人来以一种干净的方式来构建我的查询。
  • 对每一个都使用 try/except 语句.text.strip()——代码很难看。
  • 我可以修补 .find 命令以获得 try/except,或者包含一个.myfind执行类似操作的命令——这涉及到我修补东西并可能会甩掉协作者。

那里的其他人有更好/更聪明的解决方案来解决这个问题吗?

编辑:现在我正在使用一个无聊的 ol' 函数来尝试/除.text.strip()

def text_strip(soup_search):
    if soup_search != None:
        return soup_search.text.strip()
    else:
        return ""
4

4 回答 4

6

写一个普通的旧函数怎么样?

def find_stripped(soup, what):
  found = soup.find(what)
  if found is not None:
    return found.text.strip()
  # maybe:
  # return ""

现在你可以:foo_stuff = find_stripped(soup, "foo")

于 2012-11-30T02:08:47.660 回答
3

我认为最安全的方法是检查是否.find()返回了 type 的实例tag

from bs4.element import Tag
foo_stuff = soup.find("foo") 

if isinstance(foo_stuff, Tag):  
  # do something with foo_stuff
于 2012-11-30T02:11:17.310 回答
1

另一种方法是在搜索时使用 Beautiful Soup 的函数参数:

http://www.crummy.com/software/BeautifulSoup/bs4/doc/#a-function

例子:

tagsWithStrippedText = bs.find_all(tagsAndStripText);

def tagsAndStripText(tag):
  if tag.text:
    tag.string = tag.text.strip()
  return True

我觉得它更有表现力。请小心设置字符串会覆盖其中的标签。

于 2013-05-20T18:49:26.293 回答
1

现在有一种更好的方法,它更安全。

my_str = soup.find("span").get_text(strip = True)

https://beautiful-soup-4.readthedocs.io/en/latest/index.html?highlight=strip#get-text

于 2021-10-11T13:41:19.547 回答