gpt4 book ai didi

python - HTMLParser 能否区分链接文本和其他数据?

转载 作者:行者123 更新时间:2023-12-01 06:02:47 25 4
gpt4 key购买 nike

假设我有与此类似的 html 代码:

<a href="http://example.org/">Stuff I do want</a>
<p>Stuff I don't want</p>

使用 HTMLParser 的 handle_data 不能区分链接文本(我想要的东西)(这是正确的术语吗?)和我不想要的东西。 HTMLParser 是否有内置方法让 handle_data 仅返回链接文本而不返回其他内容?

最佳答案

基本上你必须写一个handle_starttag()方法也是如此。只需保存您看到的每个标签 self.lasttag或者其他的东西。然后,在你的handle_data()中方法,只需查看 self.lasttag看看它是否是'a' (表明您看到的最后一个标记是 HTML anchor 标记,因此您位于链接中)。

像这样的东西(未经测试)应该可以工作:

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

lasttag = None

def handle_starttag(self, tag, attr):
self.lasttag = tag.lower()

def handle_data(self, data):
if self.lasttag == "a" and data.strip():
print data

事实上,HTML 中允许在 <a...> ... </a> 内包含其他标签。容器。并且还可以有包含文本但不是链接的 anchor (无 href= 属性)。如果需要,这些情况都可以处理。同样,此代码未经测试:

from HTMLParser import HTMLParser

class MyHTMLParser(HTMLParser):

inlink = False
data = []

def handle_starttag(self, tag, attr):
if tag.lower() == "a" and "href" in (k.lower() for k, v in attr):
self.inlink = True
self.data = []

def handle_endtag(self, tag):
if tag.lower() == "a":
self.inlink = False
print "".join(self.data)

def handle_data(self, data):
if self.inlink:
self.data.append(data)

HTMLParser 就是您所说的 SAX 样式解析器,它会通知您经过的标签,但让您自己跟踪标签层次结构。您可以通过此处第一个和第二个版本之间的差异看到这会变得多么复杂。

DOM 样式的解析器更容易用于此类任务,因为它们将整个文档读入内存并生成易于导航和搜索的树。 DOM 风格的解析器往往比 SAX 风格的解析器使用更多的内存并且速度更慢,但这一点现在比十年前要重要得多。

关于python - HTMLParser 能否区分链接文本和其他数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404309/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com