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()最も安全な方法は、タイプのインスタンスが返されたかどうかを確認することだと思います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

別のアプローチは、検索時にBeautifulSoupの関数パラメーターを使用することです。

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 に答える