我正在尝试查看一个html文件并从中删除所有标记,以便只留下文本,但我的正则表达式有问题。这是我到目前为止所做的。
import urllib.request, re
def test(url):
html = str(urllib.request.urlopen(url).read())
print(re.findall('<[\w\/\.\w]*>',html))
html是一个简单的页面,其中包含一些链接和文本,但我的正则表达式不会被拾取!DOCTYPE HTML PUBLIC“ - // W3C // DTD HTML 4.01 Transitional // EN”和'a href =“.. ..“标签。任何人都可以解释我的正则表达式需要改变什么吗?
答案 0 :(得分:14)
使用BeautifulSoup。使用lxml。不要使用regular expressions来解析HTML。
编辑2010-01-29:这将是lxml:
的合理起点from lxml.html import fromstring
from lxml.html.clean import Cleaner
import requests
url = "https://stackoverflow.com/questions/2165943/removing-html-tags-from-a-text-using-regular-expression-in-python"
html = requests.get(url).text
doc = fromstring(html)
tags = ['h1','h2','h3','h4','h5','h6',
'div', 'span',
'img', 'area', 'map']
args = {'meta':False, 'safe_attrs_only':False, 'page_structure':False,
'scripts':True, 'style':True, 'links':True, 'remove_tags':tags}
cleaner = Cleaner(**args)
path = '/html/body'
body = doc.xpath(path)[0]
print cleaner.clean_html(body).text_content().encode('ascii', 'ignore')
你想要的内容,所以大概你不想要任何javascript或CSS。此外,大概你只想要身体中的内容,而不是头脑中的HTML。阅读lxml.html.clean,了解您可以轻松删除的内容。比正则表达式更聪明,没有?
另外,请注意unicode编码问题。您可以轻松地使用无法打印的HTML。
2012-11-08:从使用urllib2更改为requests。只需使用请求!
答案 1 :(得分:-1)
import re
patjunk = re.compile("<.*?>| |&",re.DOTALL|re.M)
url="http://www.yahoo.com"
def test(url,pat):
html = urllib2.urlopen(url).read()
return pat.sub("",html)
print test(url,patjunk)