2016-11-22 7 views
2

問題:私はhtmlファイルを持っています。いくつかのタグを含んでいます。そして、class属性を持つタグ(table) Python3.5.2(Mac Sierra)では正常に動作しますが、python3.4.2(raspberry pi)では動作しません。その理由を知りたいのですが。BeautifulSoup select関数は、Python3.5.2とPython3.4.2の動作が異なります

<!DOCTYPE html> 
<html> 
<head> 
    <title>test</title> 
</head> 
<body> 
<table class="maincontainer"> 
    <tbody> 
     <tr>中文</tr> 
     <tr> 
      <td> 
       <table class="main"> 
        <tbody> 
         <tr> 
          <td class="embedded"> 
           <td></td> 
           <table class="targets"></table> 
          </td> 
         </tr> 
        </tbody> 
       </table> 
      </td> 
     </tr> 
    </tbody> 
</table> 
</body> 
</html> 

と、ここで私はPythonのファイルに書き込む方法です:ここで

は、例えば、htmlファイル(test.htmlという)がある

str='' 
with open('test.html','rt',encoding='utf-8') as f: 
    str=f.read() 
from bs4 import BeautifulSoup 
soup=BeautifulSoup(str) 
table=soup.select('table[class="targets"]') 

ので、誰もがこれらの以下の質問について教えてくださいすることができます:

  • どのように選択機能が機能しますか?
  • これは3.4.2では動作しませんが、3.5.2では動作しますか?
  • この問題を解決するための回答はありますか?

答えて

3

これは、3.5および3.4​​のPython環境に異なるモジュールがインストールされているためです。

soup = BeautifulSoup(str) 

BeautifulSoup would pick the parser automaticallyインストールされたモジュールのいずれかから選択する:あなたは明示的に希望パーサ名を渡さないとき。あなたはlxmlがインストールされている場合、それはそれを選ぶだろう、そうでない場合は、それがhtml5libを選ぶだろう - それがインストールされていない場合、それは内蔵のhtml.parserを選ぶだろう:

何も指定しない場合は、あなたを」 という最高のHTMLパーサーがインストールされます。 Beautiful Soupはlxmlのパーサを最高のものとしてランク付けし、次に html5lib's、次にPythonの組み込みパーサをランク付けします。

つまり、将来の関連する問題を避けるために、パーサを明示的に定義する必要があります。特定のケースでどちらが適切かを判断して設定します。

soup = BeautifulSoup(str, "html5lib") 
# or soup = BeautifulSoup(str, "lxml") 
# or soup = BeautifulSoup(str, "html.parser") 
関連する問題