2016-12-31 3 views
1

Ich versuche, eine bestimmte Art des Herausziehens von Text aus dem folgenden HTML zu erstellen.BeautifulSoup4 soup.find ('tag', text = re.compile ('mein Text')) funktioniert nur manchmal

</table> 
<table border="0" cellpadding="0" cellspacing="0"> 
<tr> 
<td>Close Date:</td> 
<td> June 19, 2008</td> 

Meine Frage ist, warum so etwas wie:

soup.find('td', text=re.compile('Close')) 

kehrt:

<td>Close Date:</td> 

Allerdings, wenn ich versuchen, es etwas präziser zu tun nichts zurückgibt.

soup.find('td', text=re.compile('Close Date:')) 

Ich mag das Skript so spezifisch wie möglich machen, so dass ich es durch mehrere Webseiten ohne fehlerhaften Text Aufnehmen ausführen kann.

+0

Does 'soup.find ('td', text = re.compile ('Schließen \ s + Datum:')) 'Arbeit? Dies würde 1 oder mehr Leerzeichen zwischen "Schließen" und "Datum" entsprechen - was hilfreich sein könnte, wenn das Leerzeichen tatsächlich ein [geschützter Speicherplatz] ist (http://stackoverflow.com/q/1357078/190597) (dh ' ') – unutbu

+0

@unutbu Ich glaube nicht '\ s' passt'   '. – DyZ

+0

Ja! Das hat funktioniert! Viel Obligated –

Antwort

1

Zwischen Close und Date liegt möglicherweise ein geschützter Zwischenraum. In diesem Fall könnten Sie \s+ verwenden 1-oder-mehr Leerzeichen zum Spiel:

print(soup.find('td', text=re.compile('Close\s+Date:'))) 

Zum Beispiel

import re 
import bs4 as bs 

content = '''\ 
<table border="0" cellpadding="0" cellspacing="0"> 
<tr> 
<td>Close&nbsp;Date:</td> 
<td> June 19, 2008</td> 
''' 

soup = bs.BeautifulSoup(content, 'lxml') 
print(soup.find('td', text=re.compile('Close\s+Date:'))) 

Ausbeuten

<td>Close Date:</td>