我希望将html中的html标题<h1> - <h6>
与python正则表达式匹配。有些标题包含'id'属性,我想把它放到一个组中。
通过尝试以下表达式,我得到一个具有id属性的表达式。
>>>re.findall(r'<h[1-6].*?(id=\".*?\").*?</h[1-6].*?>','<h1>Header1</h1><h2 id="header2">header2</h2>')
['id="header2"']
问号使RE匹配前面RE的0或1次重复。如果我在右括号后面加上?,它将返回两个空字符串。
>>>re.findall(r'<h[1-6].*?(id=\".*?\")?.*?</h[1-6].*?>','<h1>Header1</h1><h2 id="header2">header2</h2>')
['', '']
如何使用一个正则表达式获得以下结果?
['', 'id="header2"']
答案 0 :(得分:5)
您使用的是错误的工具。不要使用正则表达式来解析HTML。改为使用HTML解析器。
BeautifulSoup library使您的任务变得微不足道:
from bs4 import BeautifulSoup
soup = BeautifulSoup(htmlsource)
headers = soup.find_all(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])
print [h.attrs.get('id', '') for h in headers]
演示:
>>> from bs4 import BeautifulSoup
>>> htmlsource = '<h1>Header1</h1><h2 id="header2">header2</h2>'
>>> soup = BeautifulSoup(htmlsource)
>>> headers = soup.find_all(['h1', 'h2', 'h3', 'h4', 'h5', 'h6'])
>>> [h.attrs.get('id', '') for h in headers]
['', 'header2']
答案 1 :(得分:1)
'。'与空格不匹配,因此您需要明确包含它们。 一种可能性是:
>>> re.findall(r'<h[1-6].*?( +id=\".*?\" ?)?.*?</h[1-6].*?>','<h1>Header1</h1><h2 id="header2">header2</h2>')
['', ' id="header2"']