Я пишу код для объединения функций из библиотеки чтения 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 все еще не работает. Исправления, которые я пробовал, но они не сработали:
import BeautifulSoup
из кода rawdog и повторно -установить rawdog for x in filter(lambda y: y.startswith('rawdog'), sys.modules.keys()): del sys.modules[x]
from rawdoglib.rawdog import FeedState
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 неисправен. Так должен ли я просто искать мой ввод для такого блока, или есть лучший обходной путь?