2017-11-22 10 views
1

Nicht sicher, warum, aber dieser Code funktioniert heute nicht wie erwartet (ich habe andere Male den gleichen Code für andere HTML verwendet und arbeitete wie ein Charme). Ich versuche herauszufinden, ob der Text "Anular" im HTML-Code ist. Aber kommt immer als Nein, wenn der Text dort sichtbar ist.Verwenden Sie BS4 für WebScraping Validierung

-Code ist:

from bs4 import BeautifulSoup 
    import re 
    html = browser.page_source 
    soup = BeautifulSoup(html, "html.parser") 
    if soup.findAll(text = re.compile('Anular')): 
     registo2 = "Yes" 
    else: 
     registo2 = "No" 

Html (ein Teil davon) ist:

</td> 
</tr></tbody></table> 
<span class="filter" style="display: block; width: 100%; position: absolute; top:17px;" id="Almoço"> 
<form action="" method="post" name="itens" id="item_frm"> 
<input type="hidden" name="item" value="30" /><span style="top: 70px;" class="item_check2">Marcada</span><br /><div style="display:none;z-index:1000;position:fixed;" class="divBlockClass" id="divBlock7172"></div><br /><div style="z-index:10001;" id="msgbox_ref_7172" class="msgbox_ref"><span id="msg_ref_7172"></span><br /><br /><input type="submit" onclick=" 
             document.getElementById('msgbox_ref_7172').style.visibility='hidden'" onmouseout="this.className='input_off'" onmouseover="this.className='input_on'" name="SetData" class="input_off" id="btn_marcar" value=" OK " /> 
             <input type="button" onclick="document.getElementById('msgbox_ref_7172').style.visibility='hidden';document.getElementById('divBlock7172').style.display='none'" onmouseout="this.className='input_off'" onmouseover="this.className='input_on'" class="input_off" value="Cancelar" /> 
             </div><br /><span class="itemref_btn"> 
                     <input type="button" "="" onclick="document.getElementById('marcada').value='true';document.getElementById('divBlock7172').style.display='block'; document.getElementById('msgbox_ref_7172').style.visibility='visible'; 
                     document.getElementById('msgbox_ref_7172').style.top=event.pageY+'px'; 
                     document.getElementById('msg_ref_7172').innerHTML='Tem a certeza que deseja anular?';" onmouseout="this.className='input_off'" onmouseover="this.className='input_on'" style="cursor: pointer; width: 112px;" value="Anular Refeição" class="input_off" id="btn_anular_7172" /></span><table cellspacing="0" cellpadding="0" border="0" width="95%;" id="conteudoTabela"> 

Jede Idee, warum nicht funktioniert? Etwas, das in der Regexp verbessert werden könnte? Danke.

+0

Ihr Import kommt nach der Deklaration des Parsers. – Mai

+0

falsche Kopie einfügen von der IDLE. Wird es in einem Moment korrigieren. Danke – Gonzalo

Antwort

1

In dem HTML-Code, den Sie angegeben haben, ist die Zeichenfolge, die Sie suchen, im Attribut 'value' des Tags enthalten.
So Ihr Code wäre:

if soup.find_all(value=re.compile('Anular')): 
    registo2 = "Yes" 
else: 
    registo2 = "No" 

Oder wenn Sie nach einer Zeichenkette in Text überprüfen möchten oder Attribute Sie eine function in find_all verwenden können.

def f(tag): 
    return 'Anular' in tag.get('value', '') or 'Anular' in (tag.string or '') 

registo2 = "Yes" if soup.find_all(f) else "No" 
+0

Vielen Dank. Ich verstehe jetzt. – Gonzalo