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

How to use Python's HTMLParser to extract specific links

提问人:initWithStyle 提问时间:3/14/2012 最后编辑:kindallinitWithStyle 更新时间:10/16/2023 访问量:8027

问:

我一直在使用 HTMLParser 类在 Python 中开发一个基本的网络爬虫。我使用修改后的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]

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

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

<td class="title"><a href="http://www.stackoverflow.com">StackOverflow</a><span class="comhead"> (arstechnica.com) </span></td>
python 解析 超链接 web-crawler html-解析

评论

0赞 vireshas 3/14/2012
检查标签的父级是否为 title !
0赞 initWithStyle 3/14/2012
你建议如何做?
1赞 dangerChihuahua007 3/14/2012
你签出过 Python lxml 库了吗?它可以非常有效地解析页面上的链接和其他元素。lxml.de
0赞 initWithStyle 3/14/2012
不,我没有,我会检查一下。不过,必须有一种方法可以使用 HTMLParser 类来做到这一点。我似乎在任何地方都找不到有关handle_starttag方法的太多信息。
1赞 vireshas 3/14/2012
我会用 BeautifulSoup :)你想让我发布 BeautifulSoup 的解决方案吗?

答:

7赞 kindall 3/14/2012 #1

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

例如,如果您看到一个标签,则您知道自己在表格单元格中,并且可以设置一个标志来达到该效果。当您看到 时,您知道您已经离开了表格单元格,并且可以清除该标志。(实际上,您希望使用计数器而不是简单的标志来允许嵌套表,但我们会让它滑动)。<td></td>

要获取表格单元格内的链接,如果您看到并且知道自己在表格单元格中(因为您设置了该标志),则获取标签属性的值(如果有)。<a>href

from HTMLParser import HTMLParser

class LinkExtractor(HTMLParser):

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

    def handle_starttag(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

这很快就会变得很痛苦,因为您需要越来越多的上下文才能从文档中获取所需的内容,这就是人们推荐和 .这些是 DOM 样式的解析器,可为您跟踪文档层次结构并提供各种友好的导航方式,例如 DOM API、XPath 和/或 CSS 选择器。lxmlBeautifulSoup

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

评论

2赞 user4520 11/6/2015
如果可以的话,我会投两次赞成票,因为建议使用而不是像其他所有帖子中那样带有内部的愚蠢。dict(attr)forif