BeautifulSoup / lxml比赛条件

时间:2014-11-06 17:28:09

标签: python xml beautifulsoup

我的远程服务器上有一个似乎是竞争条件的东西......我无法通过一个简单的命令行示例重现(我知道这是一个很好的问题开头)。但它一直是错误的,我无法弄清楚为什么。我尝试过谷歌搜索,但唯一能找到的相关内容是known BS4 / mod_wsgi bug with xml。不是我所看到的。在与我的问题相关的BeautifulSoup启动板站点中似乎没有任何开放的错误。

在Red Hat VM(Enterprise Linux,6.3)上,我运行的是Python 2.6.6 / Django 1.6.2,以及运行mod_wsgi的Apache。我正在使用BeautifulSoup 4来创建一个简单的XML文档。大约一半的时间失败并创建一个空的XML文档。 self是一个具有以下结构的类:

self.my_original_object = instance of class MyObjects
self.my_original_object._my_map = nested dict of attributes

其中:

def has_text(self, label):
    if label in self.my_original_object._my_map['texts']:
        return True
    return False

def get_text(self, label):
    if self.has_text(label):
        return self.my_original_object._my_map['texts'][label]
    raise IllegalState()

在有缺陷的代码上:

import logging
logging.info(self.get_text('body'))
soup = BeautifulSoup('<problem><p>' + self.get_text('body') + '</p></problem>', ['lxml','xml'])
problem = soup.find('problem')
logging.info(soup)
problem['display_name'] = question['displayName']['text']

在我的日志中,我看到汤或不汤,不一致 - 我不断刷新网页,有时我得到正确的数据,有时是例外。

错误结果(self.get_text('body') == 'what??')

INFO 2014-11-06 11:44:43,359 item_records 60428 139914916681696 what??
INFO 2014-11-06 11:44:43,359 item_records 60428 139914916681696 <?xml version="1.0" encoding="utf-8"?>
INFO 2014-11-06 11:44:43,360 utilities 60428 139914916681696 An exception of type TypeError occurred in assessments.views.ItemTextAsFormat.get(). Arguments:
("'NoneType' object does not support item assignment",)

预期结果:

INFO 2014-11-06 11:43:07,917 item_records 58188 139914916681696 what??
INFO 2014-11-06 11:43:07,918 views 58188 139914916681696 <problem display_name="test" max_attempts="0" rerandomize="never" showanswer="closed">
 <p>
  what??
 </p>
 <multiplechoiceresponse>
  <choicegroup direction="vertical">
   <choice correct="true" name="Choice 1">
    <text>
     1
    </text>
   </choice>
   <choice correct="false" name="Choice 2">
    <text>
     2
    </text>
   </choice>
  </choicegroup>
 </multiplechoiceresponse>
</problem>

我可以重新编写代码来逐步构建初始XML文档,这似乎工作正常:

import logging
logging.info(self.get_text('body'))
soup = BeautifulSoup('<problem></problem>', ['lxml','xml'])
p = soup.new_tag('p')
problem = soup.find('problem')
p.string = self.get_text('body')
problem.append(p)
logging.info(soup)
problem['display_name'] = question['displayName']['text']

降级到BeautifulSoup 3似乎也解决了这个问题,所以我有多个解决方法。只是好奇其他人是否看到过类似的东西,或者我是否应该使用不同的BS4来构建XML文档。

0 个答案:

没有答案