how - install beautifulsoup python 3
¿Cómo evito que sopa hermosa salte filas mientras se analiza? (1)
durante el uso de beautifulsoup para analizar una tabla en html cada dos filas comienza con
<tr class="row_k">
en lugar de una etiqueta tr sin una clase
Muestra de HTML
<tr class="row_k">
<td><img src="some picture url" alt="Item A"></td>
<td><a href="some url"> Item A</a></td>
<td>14.8k</td>
<td><span class="drop">-555</span></td>
<td>
<img src="some picture url" alt="stuff" title="stuff">
</td>
<td>
<img src="some picture url" alt="Max llll">
</td>
</tr>
<tr>
<td><img src="some picture url" alt="Item B"></td>
<td><a href="some url"> Item B</a></td>
<td>64.9k</td>
<td><span class="rise">+165</span></td>
<td>
<img src="some picture url" alt="stuff" title="stuff">
</td>
<td>
<img src="some picture url" alt="max llll">
</td>
</tr>
<tr class="row_k">
<td><img src="some picture url" alt="Item C"></td>
<td><a href="some url"> Item C</a></td>
<td>4,000</td>
<td><span class="rise">+666</span></td>
<td>
<img src="some picture url" title="stuff">
</td>
<td>
<img src="some picture url" alt="Maximum lllle">
El texto que deseo extraer es 14.8k, 64.9k y 4.000
this1 = urllib2.urlopen(''my url'').read()
this_1 = BeautifulSoup(this1)
this_1a = StringIO.StringIO()
for row in this_1.findAll("tr", { "class" : "row_k" }):
for col in row.findAll(re.compile(''td'')):
this_1a.write(col.string if col.string else '''')
Item_this1 = this_1a.getvalue()
Me da la sensación de que este código está mal escrito. ¿Existe alguna herramienta más flexible que pueda usar, como un analizador XML? que alguien podría sugerir
todavía abierto a cualquier respuesta que todavía utilice beautifulsoup.
Todavía estoy aprendiendo mucho, pero te sugiero que pruebes lxml. Voy a hacer una puñalada sobre esto y creo que en su mayoría te llevará allí, pero puede haber algunas sutilezas de las que no estoy seguro.
asumiendo que this1 es una cadena
from lxml.html import fromstring
this1_tree=fromstring(this1)
all_cells=[(item[0], item[1]) for item in enumerate(this1_tree.cssselect(''td''))] # I am hoping this gives you the cells with their relative position in the document)
Lo único de lo que no estoy totalmente seguro es si prueba la clave o el valor o el contenido de texto de cada celda para averiguar si tiene la cadena que está buscando en la referencia o el texto del delimitador. Es por eso que quería una muestra de tu html. Pero uno de esos debería funcionar
the_cell_before_numbers=[]
for cell in all_cells:
if ''Item'' in cell[1].text_content():
the_cell_before_numbers.append(cell[0])
Ahora que tienes la celda antes que tu puedes obtener el valor que necesitas obteniendo el contenido de texto de la siguiente celda
todays_price=all_cells[the_cell_before_number+1][1].text_content()
Estoy seguro de que hay una manera más bonita, pero creo que esto te llevará hasta allí.
Probé usando tu html y obtuve lo que estabas buscando.