优雅的方式安全.text.strip()在BeautifulSoup?

时间:2012-11-30 01:58:49

标签: python beautifulsoup

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

在某些情况下,soup.find找不到任何内容,结果.text.strip()会中断。在我看来,我可以通过以下几种方式解决这个问题:

  • 撰写始终返回某些内容的.find个查询 - 我不是一个聪明的人,能够以干净的方式构建我的查询。
  • 在每个.text.strip()上使用try / except语句 - 代码很难看。
  • 我可以修补.find命令来尝试/删除,或者包含一个类似的.myfind命令 - 这涉及到修补内容并可能会抛弃协作者。

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

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

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

3 个答案:

答案 0 :(得分:2)

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

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")

答案 1 :(得分:2)

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

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

if isinstance(foo_stuff, Tag):  
  # do something with foo_stuff

答案 2 :(得分: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

我发现它更有表现力。设置字符串会覆盖其中的标记时要小心。