BeautifulSoup - 检查价值

时间:2017-06-29 18:46:20

标签: python beautifulsoup

我使用BeautifulSoup4和Python 2.7来解析一些XML文件。我使用BS的原因是我知道文档将包含无效的标题,不一致的编码等,但我不确定lxml等无法应对。

我试图检查某些元素是否具有值......

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

只要XML是:

,这就没问题
<root>
    <person>
        <identifier><identifier>
    </person>
</root>

但是如果&#34;标识符&#34;元素被完全省略我得到一个错误&#34;没有没有属性字符串&#34;。

我的问题是处理这个问题的最佳方法是什么?在检查值之前,我宁愿避免首先检查元素是否存在。

有&#39; S

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

但这似乎有点啰嗦。

如果我使用的是lxml,我只需要

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

哪个都可以处理。

2 个答案:

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

我最终做的是 -

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

bv('person.identifier.string',locals())

这有效,但我怀疑有更好的方法可以做到这一点。