如何在Hy中更改XML标记的名称?

时间:2016-01-30 04:37:53

标签: python python-3.x beautifulsoup hy

这是我在这里发表的第一篇文章......

我正在尝试使用Hy中的assignment更改XML元素(在Python 3上运行)。

当我尝试运行代码段时:

(setv tco (BeautifulSoup "<meek/>" 'xml))
(setv (. tco meek name) "defl")
(print (. tco meek name))
;(assoc (. tco defl) "new" "value")
(.append (. tco meek) "Kool Stuff")
(print (.prettify tco))

我收到错误:

  

回溯(最近一次呼叫最后一次):文件&#34; / usr / bin / hy&#34;,第9行,在          load_entry_point(&#39; hy == 0.11.0&#39;,&#39; console_scripts&#39;,&#39; hy&#39;)()文件&#34; / usr / lib / python3 / dist- package / hy / cmdline.py&#34;,第347行,在hy_main中       sys.exit(cmdline_handler(&#34; hy&#34;,sys.argv))文件&#34; /usr/lib/python3/dist-packages/hy/cmdline.py" ;,第335行,in   cmdline_handler       返回run_file(options.args [0])文件&#34; /usr/lib/python3/dist-packages/hy/cmdline.py" ;,第210行,在run_file中       import_file_to_module(&#34; main &#34;,filename)文件&#34; /usr/lib/python3/dist-packages/hy/importer.py",第78行,in   import_file_to_module       eval(ast_compile(_ast,fpath,&#34; exec&#34;),mod。 dict )文件&#34; code-trace.hy&#34;,第196行,in       (setv(.tco meek name)&#34; defl&#34;)AttributeError:&#39; NoneType&#39;对象没有属性&#39; name&#39;

使用第二行评论:

(setv tco (BeautifulSoup "<meek/>" 'xml))
;(setv (. tco meek name) "defl")
(print (. tco meek name))
;(assoc (. tco defl) "new" "value")
(.append (. tco meek) "Kool Stuff")
(print (.prettify tco))

没有错误(必须使用代码而不是blockquote标记,以便正确显示):

meek
<?xml version="1.0" encoding="utf-8"?>
<meek>
 Kool Stuff
</meek>

请注意,这只是一个较大程序的测试代码。我也在第4行评论assoc时遇到问题。

1 个答案:

答案 0 :(得分:0)

这是一个奇怪的!看起来更改名称make(.tco meek)变为None,它确实没有name属性。所以你必须抓住那个错误。然后你必须引用(.tco defl),因为这是在赋值后知道的。这很有效。

#+BEGIN_SRC hy
(import [bs4 [BeautifulSoup]])

(setv tco (BeautifulSoup "<meek/>" 'xml))
(try (setv (. tco meek name) "defl") (except [e Exception] (print e)))
(print (. tco defl))
(assoc (. tco defl) "new" "value")
(.append (. tco defl) "Kool Stuff")
(print (.prettify tco))

#+END_SRC
#+RESULTS:
: 'NoneType' object has no attribute 'name'
: <defl/>
: <?xml version="1.0" encoding="utf-8"?>
: <defl new="value">
:  Kool Stuff
: </defl>

如果你看一下hy生成的Python:

#+begin_example
from hy import HySymbol
from bs4 import BeautifulSoup
tco = BeautifulSoup(u'<meek/>', HySymbol(u'xml'))
try:
    tco.meek.name = u'defl'
    _hy_anon_var_1 = tco.meek.name
except Exception as e:
    _hy_anon_var_1 = print(e)
print(tco.defl)
tco.defl[u'new'] = u'value'
tco.defl.append(u'Kool Stuff')
print(tco.prettify())
#+end_example

您可以在此行中看到错误:_hy_anon_var_1 = tco.meek.name。我想tco.meek.name在运行之前的行之后不存在,所以你得到了错误。我不知道为什么hy会以这种方式扩展,它似乎与代码中的(。)的使用有关,因为其他setv表达式不会那样扩展。