提问人:initWithStyle 提问时间:3/14/2012 最后编辑:kindallinitWithStyle 更新时间:10/16/2023 访问量:8027
如何使用 Python 的 HTMLParser 提取特定链接
How to use Python's HTMLParser to extract specific links
问:
我一直在使用 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>
答:
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 选择器。lxml
BeautifulSoup
顺便说一句,我最近在这里回答了一个类似的问题。
评论
2赞
user4520
11/6/2015
如果可以的话,我会投两次赞成票,因为建议使用而不是像其他所有帖子中那样带有内部的愚蠢。dict(attr)
for
if
评论