代码之家  ›  专栏  ›  技术社区  ›  Feesih0ps

我想检索特定行上html标记内的文本

  •  0
  • Feesih0ps  · 技术社区  · 9 年前

    目前(部分)我的代码如下所示:

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

    我遇到的问题是HTMLParser。getpos总是返回(1,x)的元组,其中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)
    


    完整代码:

    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))
    
    1 回复  |  直到 9 年前
        1
  •  0
  •   Izaak van Dongen Andy Hubbard    9 年前

    关于如何解析div中的数据,您应该跟踪何时进入div和何时退出div,并在这些点之间积累数据。这在库中很容易实现,并且更接近于实际的解析,尽管我不会讨论什么是愚蠢的,什么不是愚蠢的。

    str 阅读 bytes 对象在解释器中,您可以看到这是一个问题的原因:

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

    它实际上并没有将其转换为一种等价的字符串,而是转换为一种字符串表示。这意味着bytes对象中的换行符字面上表示为 \n ,所以你没有得到任何行号。要解码bytes对象,应该使用 .decode

    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)
    

    对我来说,这正确地输出了如下内容:

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

    看了这一页,我必须得出结论,你是对的——它的结构很奇怪,识别歌词div的唯一方法是通过行号,或者可能是以前的div的数量——如果行号失败,你可以尝试计数在中遇到的div handle_starttag