【问题标题】:Regex in Python - find all stylesheets in htmlPython 中的正则表达式 - 查找 html 中的所有样式表
【发布时间】:2013-10-27 15:56:16
【问题描述】:

这是我的 html 代码的一部分:

<link rel ="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/stylesheet.css" />
<link id='all-css-0' href='http://1' type='text/css' media='all' rel='stylesheet'  />
<link rel='stylesheet'  id='all-css-1' href =   'http://2' type='text/css' media='all' />

我必须找到样式表的所有href。

我尝试使用像

这样的正则表达式
 <link\s+rel\s*=\s*["']stylesheet["']\s*href\s*=\s*["'](.*?)["'][^>]*?>

完整代码是

body = '''<link rel ="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/stylesheet.css" />
<link id='all-css-0' href='http://1' type='text/css' media='all' rel='stylesheet'  />
<link rel='stylesheet'  id='all-css-1' href =   'http://2' type='text/css' media='all' />''''

real_viraz = '''<link\s+rel\s*=\s*["']stylesheet["']\s*href\s*=\s*["'](.*?)["'][^>]*?>'''
r = re.findall(real_viraz, body, re.I|re.DOTALL)
print r

但问题是 rel='stylesheet'href=''&lt;link ...&gt; 中可以是任意顺序,几乎可以是它们之间的所有内容.

请帮我找到正确的正则表达式。谢谢。

【问题讨论】:

  • 我猜有人会在这里粘贴一个非常有名的链接...

标签: python regex stylesheet


【解决方案1】:

不知何故,你的名字看起来像一个电力自动化工具Sikuli :)

如果您尝试在 Python 中解析基于 HTML/XML 的文本。 BeautifulSoup(DOCUMENT)是一个非常强大的库来帮助你。否则,您确实是在重新发明轮子(来自Randy Sargent 的一个有趣故事)。

from bs4 import BeautifulSoup4
# in case you need to get the page first. 
#import urllib2
#url = "http://selenium-python.readthedocs.org/en/latest/"
#text = urllib2.urlopen("url").read()
text = """<link rel ="stylesheet" type="text/css" href="catalog/view/theme/default/stylesheet/stylesheet.css" /><link id='all-css-0' href='http://1' type='text/css' media='all' rel='stylesheet'  /><link rel='stylesheet'  id='all-css-1' href =   'http://2' type='text/css' media='all' />"""
soup = BeautifulSoup(text)
links = soup.find_all("link", {"rel":"stylesheet"})
for link in links:
    try:
        print link['href']
    except:
        pass

输出是:

catalog/view/theme/default/stylesheet/stylesheet.css
http://1
http://2

学好beautifulsoup,您就可以100% 准备好解析HTML 或XML 中的任何内容。 (将来您可能还想将SeleniumScrapy 放入您的工具箱中。)

【讨论】:

  • BeautifulSoup 解析器已集成在lxml 中,与lxml 的HTML 解析器相比是much slower。因此,除非您确定必须处理损坏的 HTML,否则您应该首先尝试更严格和更快的解析器。
  • @LukasGraf 你可以做 BeautifulSoup(text, 'lxml') 来使用你想要的任何解析器,而 lxml 是选项之一。
【解决方案2】:

简答:不要使用正则表达式来解析 (X)HTML,使用 (X)HTML 解析器。

在 Python 中,这将是 lxml。您可以使用 lxml 的 HTML Parser 解析 HTML,并使用 XPath 查询获取所有 link 元素,并收集它们的 href 属性:

from lxml import etree

parser = etree.HTMLParser()

doc = etree.parse(open('sample.html'), parser)
links = doc.xpath("//head/link[@rel='stylesheet']")
hrefs = [l.attrib['href'] for l in links]

print hrefs

输出:

['catalog/view/theme/default/stylesheet/stylesheet.css', 'http://1', 'http://2']

【讨论】:

  • 谢谢,这正是我需要的:)
【解决方案3】:

我对 Stack-Exchange 中的许多开发人员感到惊讶,他们坚持使用外部模块而不是 RE 模块来获取数据和解析字符串、HTML 和 CSS。没有什么比 RE 更有效或更快。

这两行不仅获取 CSS 样式表路径,而且如果有多个 CSS 样式表,还可以获取几个,并将它们放入一个漂亮的 Python 列表中以供处理或用于 urllib 请求方法。

a = re.findall('link rel="stylesheet" href=".*?"', t)
a=str(a)

也适用于那些不知道 Native C 使用大多数开发人员知道的 HTML 注释行的人。

<!-- stuff here -->

这允许 RE 中的任何东西随意处理和抓取 HTML 或 CSS 中的数据。或者删除用于在单个迭代中测试浏览器功能的讨厌的 Java 脚本块,如下所示。

txt=re.sub('<script>', '<!--', txt)
txt=re.sub('</script>', '-->', txt)
txt=re.sub('<!--.*?-->', '', txt)

Python 保留了原生 C 的所有正则表达式,因此请大家使用。这就是他们的目的,没有什么比 Beautiful Soup 和 HTMLParser 慢。 使用 RE 模块从 Html 标签和 CSS 中获取所有数据。或者来自字符串可以包含的任何内容。如果你对一个不是字符串类型的变量有问题,那么用一小行代码把它变成一个字符串。

var=str(var)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-27
    相关资源
    最近更新 更多