2017-09-25 19 views
0

私はhtml.parserとurllib.requestを使用しています。私は非ネイティブモジュールを使用するつもりはありませんが、必要であれば他のネイティブモジュールを使用しています。 現在(の一部)私のコードは次のようになります。特定の行のhtmlタグ内のテキストを取得したい

class MyHTMLParser(HTMLParser): 
    def handle_data(self, data): 
     if self.getpos()[0] == 167: 
      print(self.data) 

私が午前問題はHTMLParser.getposは常にxは毎回増加数であるのタプル(1、X)を、返すことですしかし、一見ランダムに)、次のように:

 
(1, 21) 
(1, 41) 
(1, 51) 
(1, 77) 
(1, 134) 
(1, 206) 
(1, 406) 
(1, 509) 
(1, 553) 
(1, 627) 
(1, 680) 
(1, 784) 
(1, 1143) 
(1, 1368) 

私は、全体のhtml.parserモジュールは非常に愚かな方法で書かれており、より良い考え抜かれている可能性のように感じます。明らかにそれは動作しますが、直観に反します。
全コード:

from urllib.request import * 
from html.parser import HTMLParser 
class MyHTMLParser(HTMLParser): 
    def handle_data(self, data): 
     print(self.getpos()) 
     if self.getpos()[0] == 167: 
     print(data) 
parser = MyHTMLParser() 
html = urlopen("https://www.azlyrics.com/lyrics/aha/takeonme.html").read() 
parser.feed(str(html)) 
+0

あなたのコードは正しいことをしていますか? HTMLの167行目を印刷しようとしていますか?解析しているHTMLの外観を教えてください。 (もし1行目だけだとすれば、1行のファイルだと思います)。また、私は実際にあなたが愚かな使用を主張するPythonライブラリを呼び出すものが質問に追加されているかどうかは分かりません。 –

+0

HTMLは[this](https://www.azlyrics.com/lyrics/aha/takeonme.html)のようなページです。私は、常に167行目にあるdivタグの中から歌詞(文字列)データを取り出し、それを文字列変数に代入しようとしています。私はそれが愚かであると言っています。なぜなら、おそらくより直感的なモジュールを使用することは、他人に警告するためです。私は学校コンピュータがネイティブモジュールしか持っていないので、私はそれを使用する必要がありません。私はBeautifulSoupを使用するように5人を教えないようにしています。 – Feesih0ps

+0

その出力を生成している完全なコードサンプルを投稿できますか?それは私にとってうまくいっているようだ。 –

答えて

0

DIVからのデータを解析する方法について - あなたはdiv要素を入力したときに追跡し、DIVを終了し、これらの点の間でデータを蓄積する必要があります。これはライブラリでは簡単ですが、実際の解析にはかなり近いところにありますが、私は愚かで何が愚かではないかについて議論するつもりはありません。

オブジェクトを読み取るときにstrを使用しているため、回線番号に関する問題が発生しています。これが問題である理由インタプリタでは、あなたが見ることができます:

>>> str(b"ab\nc") 
"b'ab\\nc'" 

それは実際に同等の文字列のようなものに、しかし、文字列表現に変換しません。これは、バイトオブジェクト内の改行が文字通り\nと表されているため、行番号が取得されていないことを意味します。バイトオブジェクトをデコードするには、.decodeを使用する必要があります。次のコードは動作するはずです:私は結論しなければならない

Talking away 
I don't know what I'm to say 
I'll say it anyway 
Today's another day to find you 
... 

がページを見たあなたは正しい - それはbizzarely構造だし、唯一の方法に:

import sys 

from html.parser import HTMLParser 
from urllib.request import urlopen 

class LyricParser(HTMLParser): 
    def get_lyrics(self, html): 
     self.read_lyrics = False 
     self.lyrics = [] 
     self.feed(html) 
     return "".join(self.lyrics) 

    def handle_starttag(self, tag, attrs): 
     if tag == "div" and self.getpos()[0] == 167: 
      self.read_lyrics = True 

    def handle_data(self, data): 
     if self.read_lyrics: 
      self.lyrics.append(data) 

    def handle_endtag(self, tag): 
     if tag == "div": 
      self.read_lyrics = False 

parser = LyricParser() 
page = urlopen("https://www.azlyrics.com/lyrics/aha/takeonme.html") 
lyrics = parser.get_lyrics(page.read().decode('utf-8')) 
print(lyrics) 

は、私にとっては、これは正しくようなものを出力します歌詞divが行番号、または前のdivの数であるかどうかを確認します。行番号が失敗した場合は、div3の個数をhandle_starttagで満たしてください。

+0

ありがとう!よく説明し、私のコードを大幅に改善! – Feesih0ps

関連する問題