gpt4 book ai didi

两个外部包中的python冲突

转载 作者:太空狗 更新时间:2023-10-29 19:26:50 27 4
gpt4 key购买 nike

我正在编写代码以结合来自 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
  • 从 __future__ 导入 absolute_import

不走运,如果 rawdog 被导入命名空间,我总是得到 len(BeautifulSoup(contents)) == 3。这两个包都足够复杂,以至于我无法弄清楚重叠的问题到底是什么,而且我不确定除了搜索 dir(BeautifulSoup) 和 dir( rawdog),我还没有找到很好的线索。

更新,回应答案:我忽略了每个输入文件都不会出现问题,这很重要,抱歉。有问题的文件非常大,所以我不认为我可以在这里发布它们。我将尝试找出好文件和坏文件之间的关键区别并将其发布。感谢到目前为止的调试帮助。

进一步调试!我已经确定输入文本中的这个 block 有问题:

    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";
}
}

如果我注释掉这个 block ,那么无论有没有 rawdog 导入,我都会通过 BeautifulSoup 得到正确的解析。对于 block ,rawdog + BeautifulSoup 是错误的。那么我应该只在我的输入中搜索这样的 block ,还是有更好的解决方法?

最佳答案

这是 rawdoglib.feedparser.py 中的错误. rawdog是猴子修补 smglib :第 198 行是这样写的:

if sgmllib.endbracket.search(' <').start(0):
class EndBracketMatch:
endbracket = re.compile('''([^'"<>]|"[^"]*"(?=>|/|\s|\w+=)|'[^']*'(?=>|/|\s|\w+=))*(?=[<>])|.*?(?=[<>])''')
def search(self,string,index=0):
self.match = self.endbracket.match(string,index)
if self.match: return self
def start(self,n):
return self.match.end(n)
sgmllib.endbracket = EndBracketMatch()

这是重现错误的脚本:

contents = '''<a><ar "none";                                                 
</a> '''
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

它在“a”标签内的“<”处中断。在 OP 的代码片段中,它由以下行触发:for (var i=0; i<ar.length; i++){ (注意“<”字符)。

在 rawdog 的 ML 上提交的问题:http://lists.us-lot.org/pipermail/rawdog-users/2012-August/000327.html

关于两个外部包中的python冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11937081/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com