我正在尝试使用以下方法获取所有 innerHTML 链接
import re
s = '<div><a href="page1.html" title="page1">Go to 1</a>, <a href="page2.html" title="page2">Go to page 2</a><a href="page3.html" title="page3">Go to page 3</a>, <a href="page4.html" title="page4">Go to page 4</a></div>'
match = re.findall(r'<a.*>(.*)</a>', s)
for string in match:
print(string)
但我只得到最后一次出现,“转到第 4 页” 我认为它看到一个大字符串和几个匹配的正则表达式,它们被视为重叠并被忽略。那么,如何获得匹配的集合
['转到第 1 页', '转到第 2 页', '转到第 3 页', '转到第 4 页']
最佳答案
您的直接问题是正则表达式是贪婪的,即它们将尝试尽可能消耗最长的字符串。所以你是对的,直到最后一个 </a>
它可以。将其更改为非贪婪(.*?
):
match = re.findall(r'<a.*?>(.*?)</a>', s)
^
但是,这是一种可怕的 HTML 解析方式,而且不够健壮,而且会因最小的更改而中断。
这里有一个更好的方法:
from bs4 import BeautifulSoup
s = '<div><a href="page1.html" title="page1">Go to 1</a>, <a href="page2.html" title="page2">Go to page 2</a><a href="page3.html" title="page3">Go to page 3</a>, <a href="page4.html" title="page4">Go to page 4</a></div>'
soup = BeautifulSoup(s)
print [el.string for el in soup('a')]
# [u'Go to 1', u'Go to page 2', u'Go to page 3', u'Go to page 4']
然后,您可以使用它的强大功能来获取 href 和文本,例如:
print [[el.string, el['href'] ]for el in soup('a', href=True)]
# [[u'Go to 1', 'page1.html'], [u'Go to page 2', 'page2.html'], [u'Go to page 3', 'page3.html'], [u'Go to page 4', 'page4.html']]
关于python - 在python中获取正则表达式的所有实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17892093/