0

这是我的 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=''可以是任何顺序<link ...>,而且几乎可以是它们之间的所有内容。

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

4

3 回答 3

3

不知何故,你的名字看起来像一个电力自动化工具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放入您的工具箱中。)

于 2013-10-27T16:07:58.170 回答
1

简短的回答:不要使用正则表达式来解析 (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']
于 2013-10-27T16:08:14.953 回答
1

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

这两行不仅获取 CSS 样式表路径,还获取多个 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)
于 2017-04-26T06:10:44.270 回答