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 をインポートしていることに気付きました。だから私
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 に障害があります。このようなブロックの入力を検索する必要がありますか、それともより良い回避策がありますか?