Python 在BeautifulSoup中安全访问.text.strip()的优雅方式?
我在Python下使用BeautifulSoup进行大量的数据刮取和清理,并经常将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/
.text.strip()
附加到soup.find命令中。示例:foo\u stuff=soup.find(“foo”).text.strip()
在某些情况下,soup.find
找不到任何东西,结果是.text.strip()
中断。在我看来,我可以通过以下几种方式处理:
- 编写
查询——我不是一个足够聪明的人,无法以干净的方式将我的查询框成这样。查找总是返回某些内容的
- 在每个
上使用try/except语句——代码很难看.text.strip()
- 我可以对.find命令进行修补以进行try/except,或者包含一个执行类似操作的
命令——这涉及到我修补东西并可能甩掉协作者.myfind
.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