如何使用Python的HTMLParser提取特定链接

ini*_*yle 1 python parsing web-crawler hyperlink html-parsing

我一直在使用HTMLParser类在Python中使用基本的Web爬虫.我使用修改后的handle_starttag方法获取我的链接,如下所示:

def handle_starttag(self, tag, attrs):
    if tag == 'a':
        for (key, value) in attrs:
            if key == 'href':
                newUrl = urljoin(self.baseUrl, value)
                self.links = self.links + [newUrl]
Run Code Online (Sandbox Code Playgroud)

当我想找到页面上的每个链接时,这非常有效.现在我只想获取某些链接.

我如何才能获取<td class="title"></td>标签之间的链接,如下所示:

<td class="title"><a href="http://www.stackoverflow.com">StackOverflow</a><span class="comhead"> (arstechnica.com) </span></td>
Run Code Online (Sandbox Code Playgroud)

kin*_*all 7

HTMLParser是一种SAX风格或流式解析器,这意味着您可以在解析文档时获取文档,但不能同时获取整个文档.解析器调用您提供的方法来处理标记和其他类型的数据.您可能感兴趣的任何上下文,例如哪些标记位于其他标记内,您必须从您看到的标记中收集.

例如,如果您看到一个<td>标记,那么您知道自己位于表格单元格中,并且可以为该效果设置一个标记.当你看到时</td>,你知道你已经离开了一个表格单元格并且可以清除那个标志.要获取表格单元格中的链接,然后,如果您看到<a>并且您知道自己位于表格单元格中(因为您设置了该标记),则可以获取标记href属性的值(如果有).

from HTMLParser import HTMLParser

class LinkExctractor(HTMLParser):

    def reset(self):
        HTMLParser.reset(self)
        self.extracting = False
        self.links      = []

    def handle_startag(self, tag, attrs):
        if tag == "td" or tag == "a":
            attrs = dict(attrs)   # save us from iterating over the attrs
        if tag == "td" and attrs.get("class", "") == "title":
            self.extracting = True
        elif tag == "a" and "href" in attrs and self.extracting:
            self.links.append(attrs["href"])

    def handle_endtag(self, tag):
        if tag == "td":
            self.extracting = False
Run Code Online (Sandbox Code Playgroud)

这很快得到是一个痛苦,因为你需要越来越多的背景下,让你从文档,这就是为什么人们推荐想要什么lxmlBeautifulSoup.这些是DOM样式的解析器,可以为您跟踪文档层次结构,并提供各种友好的方式来导航它,例如DOM API,XPath和/或CSS选择器.

顺便说一句,我最近在这里回答了类似的问题.

  • 如果我可以建议使用`dict(attr)`而不是愚蠢的`for`和`if`里面,就像其他帖子一样,我会投票两次. (2认同)