【发布时间】:2012-08-09 20:18:41
【问题描述】:
我正在编写代码来组合 python rawdog RSS 阅读器库和 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() 方法返回错误的响应。当我需要 BeautifulSoup 时,我实际上不再需要 rawdog,所以我当时尝试删除包,但 BS 仍然坏了。我尝试过但无效的修复:
- 我注意到 rawdog 代码自己导入 BeautifulSoup。所以我尝试从 rawdog 代码中删除
import BeautifulSoup并重新安装 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 是错误的。那么我应该只在我的输入中搜索这样的块,还是有更好的解决方法?
【问题讨论】:
-
这看起来很奇怪(对我来说),尽管我从未使用过这两个库。我想知道
rawdoglib猴子补丁BeautifulSoup。我会尝试寻找rawdoglib的来源,寻找BeautifulSoup的导入,看看他们是否在这些模块中做了什么奇怪的事情。 -
你能发布有问题的文件吗?因为如果我处理内容为
<a><b><c>c</c></b></a>的文件,我会得到正确的结果,而rawdoglib导入不会改变任何事情。 -
我查看了 rawdog 源代码,它似乎只在一个地方导入 BeautifulSoup。删除并不能解决问题?您应该发布一个包含数据的最小示例。不要从用 UTF-8 解码的 gzip 压缩外部文件导入它,除非结果证明这是问题的一个组成部分。
-
“那么我应该在我的输入中搜索这样的块,还是有更好的解决方法?”但是你不知道触发问题的这个块是什么。那么谁知道还有哪些其他块也会触发它呢?现在你有了问题块,你可以将它嵌入到一个 short 文件中并创建一个独立的演示吗?如果无法重现问题,就很难解开这个问题......