конфликты Python в двух внешних пакетах

Я пишу код для объединения функций из библиотеки чтения RSS python rawdog и библиотеки веб-скрейпинга BeautifulSoup. Где-то внутри есть конфликт, который я пытаюсь преодолеть.

Я могу воспроизвести проблему с помощью этого упрощенного кода:

    import sys, gzip
    def scrape(filename):
        contents = gzip.open(filename,'rb').read()
        contents = contents.decode('utf-8','replace')
        import BeautifulSoup as BS
        print 'before rawdog: ', len(BS.BeautifulSoup(contents)) # prints 4, correct answer
        from rawdoglib import rawdog as rd
        print 'after rawdog: ', len(BS.BeautifulSoup(contents)) # prints 3, incorrect answer

Неважно, в каком порядке или где я выполняю импорт, импорт rawdog всегда приводит к тому, что метод BS.BeautifulSoup ()возвращает неправильный ответ. На самом деле мне больше не нужен rawdog к тому времени, когда мне понадобится BeautifulSoup, поэтому я попытался удалить пакет в этот момент, но BS все еще не работает. Исправления, которые я пробовал, но они не сработали:

  • Я заметил, что исходный код сам импортирует BeautifulSoup. Поэтому я попытался удалить import BeautifulSoupиз кода rawdog и повторно -установить rawdog
  • . удаление модулей rawdog перед импортом BeautifulSoup:
    • for x in filter(lambda y: y.startswith('rawdog'), sys.modules.keys()): del sys.modules[x]
  • импорт более конкретных классов/методов из rawdog, напримерfrom rawdoglib.rawdog import FeedState
  • дать проблемному методу новое имя до и после импорта rawdog:from BeautifulSoup import BeautifulSoup as BS
  • from __future__ import absolute_import

Не повезло, я всегда получаю len (BeautifulSoup (content ))== 3, если rawdog когда-либо был импортирован в пространство имен. Оба пакета настолько сложны, что я не смог точно определить, в чем проблема перекрывается, и я не уверен, какие инструменты использовать, чтобы попытаться выяснить это, кроме поиска в каталоге (BeautifulSoup ). ] и dir (rawdog ), где я не нашел хороших подсказок.

Обновления, ответы на ответы :Я упустил, что проблема возникает не с каждым входным файлом, что очень важно, извините. Оскорбительные файлы довольно большие, поэтому я не думаю, что смогу их разместить здесь. Я постараюсь выяснить принципиальную разницу между хорошими и плохими файлами и опубликую ее.Спасибо за помощь в отладке.

Дальнейшая отладка! Я определил этот блок во входном тексте как проблемный:

    function SwitchMenu(obj){
      if(document.getElementById){
      var el = document.getElementById(obj);
      var ar = document.getElementById("masterdiv").getElementsByTagName("span"); //DynamicDrive.com change
         if(el.style.display != "block"){ //DynamicDrive.com change
         for (var i=0; i<ar.length; i++){
            if (ar[i].className=="submenu") //DynamicDrive.com change
            ar[i].style.display = "none";
      }
      el.style.display = "block";
      }else{
        el.style.display = "none";
    }
}

}

Если я закомментирую этот блок, то я получу правильный анализ через BeautifulSoup с импортом rawdog или без него. С блоком rawdog + BeautifulSoup неисправен. Так должен ли я просто искать мой ввод для такого блока, или есть лучший обходной путь?

10
задан rodin 13 August 2012 в 18:24
поделиться