2017-09-14 58 views
2

我有工作正常以下時,有沒有孩子的h4標籤:re.compile不BeautifulSoup4文本元素工作時,有孩子

if (BS.find('div', {"id" : "table_content"}).find('h4', text=re.compile(".*Super Users.*"))): 
    print "Found Super Users!" 

然而,當h4標籤有小孩,打印從不發生。我已經嘗試使用調試以下內容:

for h4 in BS.find('div', {"id" : "table_content"}).findAll('h4'): 
    print h4.text 

主要生產:

Users  
Super Users 
    (TMP) 
      

Administrators 
.... 

基本上,(TMP)部分似乎是把它扔了,因爲它是從h4標籤的子文本,像這樣的:

<h4>Super User 
    <span>(<a href="/tmp">TMP</a>)</span> 
</h4> 

這樣做的缺點是,(TMP)並不總是存在的,所以我不能做假設。我只需要知道Super User是否在h4的文本中,那麼我可以繼續。

+0

不知道,但不會是're.compile (「。* Super Users。*」,flags = re.DOTALL)'來處理換行符? –

+0

不幸的是,這似乎並沒有奏效。這可能是行飼料,因爲我測試'如果h4.text [:5] ==「超級」'並且它通過。也許我的正則表達式關閉? – rjbogz

+0

好吧,試試're.compile(「。* Super \ s + Users。*」))',所有的空格都不是空格。 –

回答

2

find參數不要設置標籤類型(H4)或分別設置爲BS的方法:

if (BS.find('div', {"id" : "table_content"}).find(text=re.compile(".*Super Users.*"))): 
    print "Found Super Users!" 

if (BS.find('div', {"id" : "table_content"}).h4.find(text=re.compile(".*Super Users.*"))): 
    print "Found Super Users!" 
+0

哇,這樣一個簡單的解決方案。爲什麼這有所作爲? – rjbogz

+0

我不確定,但我認爲它是當前解析器的一個功能。如果你沒有設置標籤 - 它會搜索所有具有該屬性('文本')的html元素。可能當h4標籤有兄弟姐妹時,解析器決定這個文本屬於他們,但不是父母h4標籤本身。所以,當你在沒有標籤的情況下調用'find'時,你可以讓它在同級文本中搜索。 –