¿Por qué bs4 devuelve tags y luego una lista vacía a este método find_all ()?

En cuanto al QFD del Censo de EE. UU ., Estoy intentando tomar el% de raza por condado. El bucle que estoy creando está fuera del scope de mi pregunta, que concierne a este código:

url = 'http://quickfacts.census.gov/qfd/states/48/48507.html' #last county in TX; for some reason the qfd #'s counties w/ only odd numbers page = urllib2.urlopen(url) soup = BeautifulSoup(page) c_black_alone = soup.find_all("td", attrs={'headers':'rp9'})[0] #c = county % s_black_alone = soup.find_all("td", attrs={'headers':'rp9'})[1] #s = state % 

Que atrapa el elemento html incluyendo sus tags, no solo el texto que contiene:

 c_black_alone, s_black_alone (96.9%, 80.3%) 

Por encima de ^, solo quiero el% ‘s dentro de los elementos …

Además, ¿por qué

 test_black = soup.find_all("td", text = "Black") 

no devuelve el mismo elemento anterior (o su texto), sino que devuelve un objeto ResultSet bs4 vacío? (Edit: He estado siguiendo la documentación, así que espero que esta pregunta no parezca demasiado vaga …)

Para obtener el texto de esas coincidencias, use .text para obtener todo el texto contenido:

 >>> soup.find_all("td", attrs={'headers':'rp9'})[0].text u'96.9%' >>> soup.find_all("td", attrs={'headers':'rp9'})[1].text u'80.3%' 

Su búsqueda de text no coincide con nada por dos razones:

  1. Una cadena literal solo coincide con todo el texto contenido, no una coincidencia parcial. Solo funcionará para el elemento con Black

    como contenido único .

  2. Utilizará la propiedad .string , pero esa propiedad solo se establece si el texto es el único hijo de un elemento dado. Si hay otros elementos presentes, la búsqueda fallará por completo.

La forma de evitar esto es mediante el uso de un lambda en su lugar; Se pasará todo el elemento y puede validar cada elemento:

 soup.find_all(lambda e: e.name == 'td' and 'Black' in e.text) 

Manifestación:

 >>> soup.find_all(lambda e: e.name == 'td' and 'Black' in e.text) [Black or African American alone, percent, 2013 (a)  , Black-owned firms, percent, 2007  ] 

Ambas coincidencias tienen un comentario en el elemento

, lo que hace que una búsqueda con una coincidencia de text inefectiva.