我正在尝试使用以下
获取所有链接innerHTMLimport 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页']
答案 0 :(得分:2)
你当前的问题是regexp是贪婪的,也就是说他们会尝试使用最长的字符串。所以你是正确的,直到它可以找到最后</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']]
答案 1 :(得分:2)
我会避免使用正则表达式以所有成本解析HTML。根据原因查看this article和this SO post。但总结一下......
每当你试图用正则表达式解析HTML时,邪恶的孩子就会为处女的鲜血哭泣,而俄罗斯黑客会把你的webapp用来捣乱你的webapp
相反,我会看一下像BeautifulSoup或pyquery这样的python HTML解析包。它们提供了很好的界面来遍历,检索和编辑HTML。
答案 2 :(得分:1)
我建议使用lxml:
from lxml import etree
s = 'some html'
tree = etree.fromstring(s)
for ele in tree.iter('*'):
#do something
它为大文件进程提供iterParse函数,也可以像urllib2.request对象一样接受类文件对象。我一直在使用它来解析html和xml。