Python 在BeautifulSoup中安全访问.text.strip()的优雅方式?

Python 在BeautifulSoup中安全访问.text.strip()的优雅方式?,python,beautifulsoup,Python,Beautifulsoup,我在Python下使用BeautifulSoup进行大量的数据刮取和清理,并经常将.text.strip()附加到soup.find命令中。示例:foo\u stuff=soup.find(“foo”).text.strip() 在某些情况下,soup.find找不到任何东西,结果是.text.strip()中断。在我看来,我可以通过以下几种方式处理: 编写。查找总是返回某些内容的查询——我不是一个足够聪明的人,无法以干净的方式将我的查询框成这样 在每个.text.strip()上使用try/

我在Python下使用BeautifulSoup进行大量的数据刮取和清理,并经常将
.text.strip()
附加到soup.find命令中。示例:
foo\u stuff=soup.find(“foo”).text.strip()

在某些情况下,
soup.find
找不到任何东西,结果是
.text.strip()
中断。在我看来,我可以通过以下几种方式处理:

  • 编写
    。查找总是返回某些内容的
    查询——我不是一个足够聪明的人,无法以干净的方式将我的查询框成这样
  • 在每个
    .text.strip()
    上使用try/except语句——代码很难看
  • 我可以对.find命令进行修补以进行try/except,或者包含一个执行类似操作的
    .myfind
    命令——这涉及到我修补东西并可能甩掉协作者
其他人有更好/更聪明的解决方案吗

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


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

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

现在您可以:
foo\u stuff=find\u stripped(soup,“foo”)
我认为最安全的方法是检查
.find()
是否返回了
标记类型的实例

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

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

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

例如:

tagsWithStrippedText = bs.find_all(tagsAndStripText);

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

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

你能告诉我你在寻找什么样的东西吗?啊,它们都是网页(因此很漂亮)。嗯,我应该更具体一点吗?许多网页都使用微格式:你可以利用这个想法更好地利用你的搜索。有趣的是:--我来看看。到目前为止,使用Chrome的“Inspect Elements”非常棒,但我也会尝试一下。啊,是的,我忘了提到这是我当前的实现,但出于风格上的原因,我尝试让事情变为变量。mymethod。我不知道这是否让我的生活变得不必要的艰难:)但我认为这是学习过程的一部分。我宁愿选择一套自己的自定义函数,它可以干净地完成我需要的任务,而不是通过修补添加额外的方法。(如果你喜欢猴子补丁,看看Ruby,它是一种文化规范。)但是如果你想了解内部工作原理,那么补丁就是一条路。
tagsWithStrippedText = bs.find_all(tagsAndStripText);

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