2017-09-14 27 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'时,你可以让它在同级文本中搜索。 –

相关问题