我正在编写代码来组合来自 python rawdog RSS 阅读器库和 BeautifulSoup webscraping 库的函数。我正在努力克服内心的某个地方的冲突。
我可以用这个简化的代码复制这个问题:
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() 方法返回错误的响应。当我需要 BeautifulSoup 时,我实际上不再需要 rawdog,所以我当时尝试删除包,但 BS 仍然坏了。我尝试过但没有奏效的修复:
- 我注意到 rawdog 代码自己导入 BeautifulSoup。所以我尝试
import BeautifulSoup
从 rawdog 代码中删除并重新安装 rawdog - 在导入 BeautifulSoup 之前删除 rawdog 模块:
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
不走运,如果 rawdog 曾被导入命名空间,我总是得到 len(BeautifulSoup(contents)) == 3 。这两个包都足够复杂,以至于我无法确切地弄清楚问题重叠是什么,而且我不确定使用什么工具来尝试解决这个问题,除了通过 dir(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";
}
}
}
如果我注释掉这个块,那么无论是否导入 rawdog,我都会通过 BeautifulSoup 获得正确的解析。使用该块,rawdog + BeautifulSoup 是错误的。那么我应该只在我的输入中搜索这样的块,还是有更好的解决方法?