python
  • regex
  • stylesheet
  • 2013-10-27 34 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) 
    
    相關問題