我正在尝试从HTML表格中的<th>
标记之间提取文本。以下代码解释了问题
searchstr = '<th class="c1">data 1</th><th>data 2</th>'
p = re.compile('<th\s+.*?>(.*?)</th>|<th>(.*?)</th>')
for i in p.finditer(searchstr):print i.group(1)
代码产生的输出是
data 1
None
如果我将模式更改为<th>(.*?)</th>|<th\s+.*?>(.*?)</th>
,则输出更改为
None
data 2
在两种情况下捕获组的正确方法是什么。我没有使用模式<th.*?>(.*?)</th>
,因为搜索字符串中可能有<thead>
个标记。
答案 0 :(得分:5)
Why don't use an HTML Parser instead - BeautifulSoup
,例如:
>>> from bs4 import BeautifulSoup
>>> str = '<th class="c1">data 1</th><th>data 2</th>'
>>> soup = BeautifulSoup(str, "html.parser")
>>> [th.get_text() for th in soup.find_all("th")]
[u'data 1', u'data 2']
另请注意,str
对于变量名称来说是一个糟糕的选择 - 您正在隐藏built-in str
。
答案 1 :(得分:1)
您可以使用一个捕获组减少如下所示的正则表达式。
re.compile(r'(?s)<th\b[^>]*>(.*?)</th>')