2013-02-07 17 views
0

我有一個代碼的頁面:檢查網頁上的標記presense與Python

<HTML> 
<HEAD> 
<TITLE>smth</TITLE> 
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8"> 
</HEAD> 
<BODY> 
<div id="doc" class="searchN"> 
<div id="hd" style="border-bottom:0;"> 
    <a id="logo" class="logoN" href="/" alt="logo" title="open project"></a> 

</div> 
    <div id="bd-cross">  
     <ol class="site" start=1> 

      <li class=""> 
       <a href="url/">Smth</a> 
       <div class="ref"> 
       <a href="News_and_Media/">Regional: Europe:</a> 
      </div>  
      </li> 

      <li class=""> 
       <a href="url2">Descr3</a> 
       <div class="ref"> 
       <a href="url3">Descr3</a> 
      </div>  
      </li> 
.... 
</BODY> 
</HTML> 

我需要檢查在頁面<li class="">標籤存在。我使用Python + RegExp:

import re 
import urllib2 
url = 'url' 
#Parse it 
MainPage = urllib2.urlopen(url).read() 
Li = re.findall("<div id=\"bd-cross\">*<li class=\"\">*</li>", MainPage) 
try: 
    if Li: 
     print "Li tag on " +url+ ": Yes" 
    else: 
     print "Li tag on " +url+ ": No" 
except: 
    print "Error" 

輸出是否,但它應該是'因爲頁面包含它的標記。如果我打印李,它會輸出'[]'。

+5

chuck norris * can *用正則表達式解析html! – root

+0

是的,我已經錯過了它的代碼。現在編輯。 –

+0

@root Jon Skeet可以用正則表達式解析Chuck Norris的html解析!但他選擇不爲了防止奇點發生得太早。這一切都與保護真棒... –

回答

2

你應該使用一個包,如BeautifulSouplxml.html.soupparser,它會讓你的生活變得更容易。對於後者,你可以做你想做的,如下所示:

>>> import lxml.html.soupparser 
>>> MainPage = urllib2.urlopen(url).read() 
>>> HtmlDoc = lxml.html.soupparser.fromstring(MainPage) 
>>> Elements = HmtlDoc.xpath('//div[@id="bd-cross"]//li[@class=""]') 
>>> if len(Elements) > 0: 
>>>  print 'Yes' 
>>> else: 
>>>  print 'No' 
+0

謝謝你。它比使用正則表達式更容易。 –

1

假設你不想使用HTML解析器像BeautifulSoup,假設你有「BD-交叉」的地方div標籤在不屬於你的摘錄的HTML中,我敢打賭你的正則表達式並沒有跨越新的界限。

事實上,你錯過了你的正則表達式中的.字符,所以我還建議使用正則表達式測試程序來驗證你的正則表達式是否按你認爲的那樣做,如this one

要解決此問題,請將flags=re.DOTALL添加到re.findall函數的末尾作爲另一個參數。

documentation

充分利用 ''特殊字符完全匹配任何字符,包括換行符;沒有這個標誌,'。'將匹配除換行符之外的任何內容。

+0

非常感謝!嘗試做到這一點。 –