2017-04-02 55 views
-2

我試圖從html代碼中提取文本。這裏是我的代碼:爲什麼使用re.findall()的正則表達式不起作用?

import re 
Luna = open('D:\Python\Luna.txt','r+') 
text=Luna.read() 
txt=re.findall('<p>\s+(.*)</p>',text) 
print txt 

然而,只有第一<p>之前消除一部分,一切都在第一<p>保持了。我應該怎樣做才能改進我的代碼,以便它只返回<p></p>之間的部分? 這裏是原始的HTML代碼的一部分:

src="/advjs/gg728x90.js"></script></td> </tr></table><div class="text" align="justify"></p><p> Sure. Eye of newt. Tongue of snake.</p><p> She added, &ldquo;Since you&rsquo;re taking Skills for Living, it&rsquo;ll be good practice.&rdquo;</p><p> For what? I wondered. Poisoning my family? &ldquo;I have to baby-sit,&rdquo; I said, a little too gleefully.</p> 
+1

關於使用正則表達式解析HTML的強制性警告:[RegEx匹配除XHTML自包含標記之外的開放標記](// stackoverflow.com/q/1732348) –

回答

1

強烈建議您使用合適的HTML解析器,像BeautifulSoup

from bs4 import BeautifulSoup 

soup = BeautifulSoup(Luna.read()) 
para_strings = (p.get_text() for p in soup.find_all('p')) 
txt = [p.strip() for p in para_strings if p.startswith(' ')] 

您可以通過使用非貪婪解決您的正則表達式操作者(?問號追加到*操作者):

txt=re.findall('<p>\s+(.*?)</p>',text) 

但是,由於HTML不是常規語言,因此很可能會遇到其他正則表達式解析問題。

相關問題