我使用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
哪个都可以处理。
答案 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())
这有效,但我怀疑有更好的方法可以做到这一点。