python
  • regex
  • stylesheet
  • 2013-10-27 89 views 0 likes 
    0

    这是我的HTML代码的一部分:正则表达式在Python - 找到所有的样式表在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 
    

    但问题是,相对= '样式表'HREF = ''可在<link ...>的任何顺序,它可以几乎是他们之间的一切。

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

    +0

    我想有人会在这里粘贴一个非常著名的链接... – Birei

    +0

    我在等待:) – SKulibin

    回答

    1

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

    在Python中,这将是lxml。你可以使用LXML的HTML解析器解析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'] 
    
    +0

    谢谢,这是我需要:) – SKulibin

    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好,你已经准备好用于解析HTML或XML东西100%。 (你也可能想要把SeleniumScrapy在将来你的工具箱。)

    +0

    的BeautifulSoup解析器已经集成在'lxml',并为[慢得多(HTTP:// lxml.de/elementsoup.html#using-soupparser-as-a-fallback)比lxml的HTML解析器。所以除非你确定知道必须处理破碎的HTML,否则你应该首先尝试更严格和更快的解析器。 –

    +1

    @LukasGraf你可以用BeautifulSoup(text,'lxml')来使用你想要的解析器,而lxml就是其中一个选项。 –

    1

    我很惊讶由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的所有正则表达式,所以使用它们的人。这就是他们的理想,而且没有像美味汤和HTMLParser那么慢。 使用RE模块从Html标签以及CSS中获取所有数据。或者从字符串可以包含的任何东西如果你的变量不是字符串类型的问题,那么用一行代码将它变成一个字符串。

    var=str(var) 
    
    相关问题