2017-06-29 10 views
1

私はPython 2.7でBeautifulSoup4を使用していくつかのXMLファイルを解析しています。私がBSを使用している理由は、lxmlなどがうまく対応できないことは確かではありませんが、ドキュメントに無効なヘッダー、矛盾したエンコードなどが含まれることがわかっているからです。BeautifulSoup - 値を確認する

<root> 
    <person> 
     <identifier><identifier> 
    </person> 
</root> 

しかし、「識別子」の場合:私はいくつかの要素が非常に価値を持っているかどうかを確認しようとしている

... XML限り大丈夫です

if soup.person.identifier.string is None: 
    # reject file 

です要素が完全に省略されています。「Noneには属性文字列がありません」というエラーが表示されます。

私の質問は、これを処理する最もきれいな方法は何ですか?私は値をチェックする前に要素が存在することを最初に確認する必要がないようにしたいと思う。

try: 
    identifier = soup.something.identifier.string 
except: 
    identifier = None 
if identifier is None: 
    # reject file 

あまりにもビット長ったらしい思われるがあります。

私はちょうど両方を扱うでしょう

if len(root.xpath('person/identifier/text()') == 0 

にしてくださいlxmlのを使用していた場合。

答えて

0

多分何か:

items = [item for item in soup.find_all(name='somethingelse') if item.text == ""]

元。

import bs4 

string = """ 
<root> 
    <something> 
     <somethingelse></somethingelse> 
     <somethingelse>haha</somethingelse> 
    </something> 
</root> 
""" 
soup = bs4.BeautifulSoup(string, 'lxml') 

items = [item for item in soup.find_all(name='somethingelse') if item.text == ""] 

は出力:[<somethingelse></somethingelse>]

、それは私がやってしまった何を1

+0

これは私がやろうとしているとは思わない。私はより適切な名前を使用して例を書き直し、うまくいけばそれをもっと明確にするでしょう。基本的には、必要な情報が提供されているかどうかを確認するために、文書に対して多くのチェックを行う必要があります。 – George

+0

hm、多分まだ混乱しているかもしれませんが、私が作成する 'items'変数には、空白のテキストで見つけようとしている要素のリストがあります。要素がない場合、エラーは発生せず、空になります。だから、見つかったものがあるかどうかを知りたいなら 'len(items)'をチェックするだけです – Alter

0

を見つけることができない場合、それは中断されませんでした -

def bv(value_string, locals): 
    try: 
     result = eval(value_string, globals(), locals) 
    except AttributeError: 
     result = None 
    return result 

BV( '人。これはうまくいくと思いますが、これを行うには良い方法があると思います。