2016-12-15 10 views
1

私はpythonでHTMLParserとurllib3を使ってWebクローラを作成しようとしています。現在、私は最初はHTMLパーサのインポートの問題

import html.parser 
import urllib 

urlText = [] 

#Define HTML Parser 
class parseText(HTMLParser.HTMLParser): 

def handle_data(self, data): 
    if data != '\n': 
     urlText.append(data) 


#Create instance of HTML parser 
lParser = parseText() 

thisurl = "http://www-rohan.sdsu.edu/~gawron/index.html" 
#Feed HTML file into parser 
lParser.feed(urllib.urlopen(thisurl).read()) 
lParser.close() 
for item in urlText: 
    print (item) 

されている2つの異なる輸入の問題があり、このコードでそれは、Visual Studioのエラーボックスに

name 'HTMLParser' is not defined 

をエラーを返し、第二の選択肢はまったく同じですが、輸入HTMLParserであります代わりhtml.parserのエラーを返し

import HTMLParser 
import urllib 

urlText = [] 

#Define HTML Parser 
class parseText(HTMLParser.HTMLParser): 

def handle_data(self, data): 
    if data != '\n': 
     urlText.append(data) 


#Create instance of HTML parser 
lParser = parseText() 

thisurl = "http://www-rohan.sdsu.edu/~gawron/index.html" 
#Feed HTML file into parser 
lParser.feed(urllib.urlopen(thisurl).read()) 
lParser.close() 
for item in urlText: 
    print (item) 

No module named 'markupbase' 

私はパッケージで私の心を失っています。誰かが修正を知っているのか、問題があるのか​​分かりません。 Ps。私はVisual Studio 2016でこれを実行していて、Python 3.5にあります

+1

2番目のサンプルで問題を再現できません。フルトレースバックを表示してください。また、インデントを修正してください。 –

答えて

0

ウェブクロールを学ぶのと同じチュートリアルにも従っています。私はそのコードを実行すると、昨日それらの問題もありました。いくつかのGoogle検索の後、私はそれらを解決しました。私はPythonとWebクローリングに新しいので、私は何か間違って言う場合は私を修正します。

python 3.5を使用している場合は、HTMLParser from html.parserurllib.requestをインポートする必要があります。 7行目では、HTMLParser.HTMLParserの代わりにHTMLParserだけを継承する必要があります。 この時点で、あなたのコードは、あなたがこのコードを実行する場合は、HTMLParser.feed()だけの文字列を受け取り、urllib.request.urlopen().read()は、バイトなどの生データを生成しているためです。このエラー

TypeError: Can't convert 'bytes' object to str implicitly

がする今、この

from html.parser import HTMLParser 
import urllib.request 

urlText = [] 

#Define HTML Parser 
class parseText(HTMLParser): 

    def handle_data(self, data): 
     if data != '\n': 
      urlText.append(data) 


#Create instance of HTML parser 
lParser = parseText() 

thisurl = "http://www-rohan.sdsu.edu/~gawron/index.html" 
#Feed HTML file into parsers 
lParser.feed(urllib.request.urlopen(thisurl).read()) 
lParser.close() 
for item in urlText: 
    print (item) 

のように見えるはずです。そこで、この生データをutf8としてデコードします。 19行目にread()の後に.decode('utf8')を追加します。 最終的なコードが刺さにバイトを変換

from html.parser import HTMLParser 
import urllib.request 

urlText = [] 

#Define HTML Parser 
class parseText(HTMLParser): 

    def handle_data(self, data): 
     if data != '\n': 
      urlText.append(data) 


#Create instance of HTML parser 
lParser = parseText() 

thisurl = "http://www-rohan.sdsu.edu/~gawron/index.html" 
#Feed HTML file into parsers 
lParser.feed(urllib.request.urlopen(thisurl).read().decode('utf8')) 
lParser.close() 
for item in urlText: 
    print (item) 

のようになりますまた、このラインで19

lParser.feed(str(urllib.request.urlopen(thisurl).read())) 

で動作しますが、私は、この引数にしてhandle_dataを使用する場合、このような「\ nとして空白を認識しません' したがって、コードは '\ n'を削除せずに正常に動作します。

+0

ありがとうございました。これはトンを助け、完璧な答えでした。 –

+0

まだこのチュートリアルに従っていますか? – tontus