tutorial how examples beautifulsoup4 python xml tags urllib2 beautifulsoup

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.