9

我正在考虑在 python 中创建一个字典,其中键是 html 标签名称,值是标签出现的次数。有没有办法用漂亮的汤或其他东西来做到这一点?

4

3 回答 3

32

BeautifulSoup 非常适合 HTML 解析,您当然可以将它用于此目的。这将非常简单:

from bs4 import BeautifulSoup as BS

def num_apperances_of_tag(tag_name, html):
    soup = BS(html)
    return len(soup.find_all(tag_name))
于 2012-12-13T05:19:17.307 回答
11

使用 BeautifulSoup,您可以通过省略搜索条件来搜索所有标签:

# print all tags
for tag in soup.findAll():
    print tag.name # TODO: add/update dict

如果您只对出现次数感兴趣,BeautifulSoup 可能有点矫枉过正,在这种情况下您可以HTMLParser改用:

from HTMLParser import HTMLParser

class print_tags(HTMLParser):
    def handle_starttag(self, tag, attrs):
        print tag # TODO: add/update dict

parser = print_tags()
parser.feed(html)

这将产生相同的输出。

要创建您的字典,{ 'tag' : count }可以使用collections.defaultdict

from collections import defaultdict

occurrences = defaultdict(int)
# ...
occurrences[tag_name] += 1
于 2012-12-13T05:25:27.480 回答
0

这是我非常简单的解决方案:

from html.parser import HTMLParser
import requests


class MyHTMLParser(HTMLParser):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.start_tags = []
        self.end_tags = []

    def handle_starttag(self, tag, attrs):
        self.start_tags.append(tag)

    def handle_endtag(self, tag):
        self.end_tags.append(tag)


if __name__ == '__main__':
    parser = MyHTMLParser()

    html_response = requests.get('https://jetlend.ru/')
    parser.feed(html_response.text)

    print('Start tags:', len(parser.start_tags))
    print('End tags:', len(parser.start_tags))
    print('Amount:', len(parser.start_tags) + len(parser.start_tags))

来源:https ://docs.python.org/3/library/html.parser.html

于 2022-01-23T13:32:29.897 回答