python
  • html
  • regex
  • 2013-06-30 102 views 0 likes 
    0

    我試圖從下面的字符串中提取http://xyz.com/5鏈接。你可以看到只有那個我們有class="next"屬性。所以我試圖根據這個屬性來獲取它。從HTML錨點提取特定值的正則表達式

    <a href='http://xyz.com/1' class='page larger'>2</a> 
    <a href='http://xyz.com/2' class='page larger'>3</a> 
    <a href='http://xyz.com/3' class='page larger'>4</a> 
    <a href='http://xyz.com/4' class='page larger'>5</a> 
    <a href='http://xyz.com/5' class="next">»</a> 
    

    我嘗試了下面的模式,但是這會返回整個文本中的所有鏈接。

    <a href='(.+?)' class="next"> 
    

    (我從這個網站,使用正則表達式解析HTML是一個壞主意理解,但我必須現在做這個。)

    +0

    你爲什麼「需要」? – TerryA

    +1

    我同意你不應該使用正則表達式來解析HTML。然而,你的正則表達式適用於我(在多線模式下)。根據你如何運行這個,你可能不得不逃脫< >標誌。 –

    +0

    @AndyG我也注意到了這一點。 http://regexr.com?35dan – TerryA

    回答

    2

    試試這個正則表達式:

    <a href='([^']+)' class="next"> 
    

    製作一個正則表達式非貪婪並不意味着它總能找到最短的匹配。這意味着一旦它找到了一個匹配,它將返回它,它不會繼續尋找更長的匹配。換句話說,它將使用通配符右端的最短匹配,而不是左端。

    因此,您的正則表達式在第一個鏈接的開頭匹配,並且一直持續到發現class = "next"。而不是使用.+?,使用[^']+意味着通配符不會跨越屬性邊界,因此您確信只匹配一個鏈接。

    +0

    謝謝巴爾瑪。這正是我正在尋找並完全回答我的問題。謝謝!! – shibin

    2

    Please don't use regex to parse HTML。使用類似BeautifulSoup的東西。它是如此容易得多,更好:P

    from bs4 import BeautifulSoup as BS 
    html = """<a href='http://xyz.com/1' class='page larger'>2</a> 
    <a href='http://xyz.com/2' class='page larger'>3</a> 
    <a href='http://xyz.com/3' class='page larger'>4</a> 
    <a href='http://xyz.com/4' class='page larger'>5</a> 
    <a href='http://xyz.com/5' class="next">»</a>""" 
    soup = BS(html) 
    for atag in soup.find_all('a', {'class':'next'}): 
        print atag['href'] 
    

    你的榜樣,這個打印:

    http://xyz.com/5 
    

    而且,你的正則表達式works fine

    +0

    感謝您的回答,我欣賞它。實際上沒有換行字符,整個字符串只有一個。爲了可讀性,我只是做了這件事。由於我給出的示例中有新的行字符,它只是在您提供的鏈接(「正常工作」)中工作。 :)另外,我認爲如果我用Python使用我的模式,即使有新的行字符它仍然會返回所有,因爲我使用「findall」。 – shibin

    +0

    @shibin沒問題:)。 – TerryA

    相關問題