我有一个来自HTML页面的html源代码:
import requests
text = requests.get("https://en.wikipedia.org/wiki/Collatz_conjecture").text
我想做的是计算此页面上唯一 HTML 标记的数量。
例如:<head>
、<title>
。结束标记不计算在内(<head>
和</head>
将只计算一次(。
是的,我知道使用HTML解析器(例如Beautiful Soup(要容易得多,但我想仅使用正则表达式来完成此操作。
我已经蛮力计算了一下,答案就在大约 60 个唯一标签的范围内。 我将如何做到这一点?
我已经尝试使用re.findall()
,但无济于事。
由于答案是 60 左右,我希望输出是:
"Number of unique HTML tags: 60"
以下内容将从相关网址中产生 63 个 URL
import requests
import re
url = "https://en.wikipedia.org/wiki/Collatz_conjecture"
text = requests.get(url).text
url_pattern = r"((http(s)?://)([w-]+.)+[w-]+[.com]+([w-.,@?^=%&:/~+#]*[w-@?^=%&/~+#])?)"
# Get all matching patterns of url_pattern
# this will return a list of tuples
# where we are only interested in the first item of the tuple
urls = re.findall(url_pattern, text)
# using list comprehension to get the first item of the tuple,
# and the set function to filter out duplicates
unique_urls = set([x[0] for x in urls])
print(f'Number of unique HTML tags: {len(unique_urls)} found on {url}')
外:
Number of unique HTML tags: 63 found on https://en.wikipedia.org/wiki/Collatz_conjecture
拜托!不要在正则表达式中使用 bs4 等模块解析 HTML。但是,如果您坚持这样做,请执行以下操作:
import requests
import re
url = 'https://en.wikipedia.org/wiki/Collatz_conjecture'
text = requests.get(url).text
tags = re.findall('<[^>]*>',text)
total=[]
for i in range(len(tags)):
total.append(re.match('<[^s>]+',tags[i]).group())
total=[elem+'>' for elem in total]
r= re.compile('</[^<]')
unwanted =list(filter(r.match,total))
un=['<!-->','<!--[if>','<!DOCTYPE>','<![endif]-->']
unwanted.extend(un)
final=[x for x in list(set(total)) if x not in set(unwanted)]
print('Number of Unique HTML tags : ',len(final))