2010-06-16 14 views
51

¿Hay alguna biblioteca de Python que me permita analizar un documento HTML similar a lo que hace jQuery?análisis de HTML parecido a jquery en Python?

es decir, me gustaría ser capaz de utilizar la sintaxis selector CSS para agarrar un conjunto arbitrario de nodos del documento, leer sus contenidos/atributos, etc.

La única lib análisis Python HTML que he usado antes era BeautifulSoup, y aunque está bien, sigo pensando que sería más rápido hacer mi análisis si tuviera la sintaxis jQuery disponible. : D

Respuesta

47

Si domina con BeautifulSoup, puede agregar soupselect a sus libs.
Soupselect es una extensión de selector CSS para BeautifulSoup.

Uso:

>>> from BeautifulSoup import BeautifulSoup as Soup 
>>> from soupselect import select 
>>> import urllib 
>>> soup = Soup(urllib.urlopen('http://slashdot.org/')) 
>>> select(soup, 'div.title h3') 
[<h3><span><a href='//science.slashdot.org/'>Science</a>:</span></h3>, 
<h3><a href='//slashdot.org/articles/07/02/28/0120220.shtml'>Star Trek</h3>, 
..] 
+0

Esto suena como la mejor solución para mí en este momento, voy a dar una oportunidad. ¡Gracias! –

+4

Ahora es 'from bs4' para Beautiful Soup 4 – Flash

+9

En caso de que tenga un problema al instalar soupselect, debe probar la versión compatible con pip que le ofrece https://github.com/syabro/soupselect:' sudo pip install https: // github.com/syabro/soupselect/archive/master.zip' – AsTeR

35

Considere PyQuery:

http://packages.python.org/pyquery/

>>> from pyquery import PyQuery as pq 
>>> from lxml import etree 
>>> import urllib 
>>> d = pq("<html></html>") 
>>> d = pq(etree.fromstring("<html></html>")) 
>>> d = pq(url='http://google.com/') 
>>> d = pq(url='http://google.com/', opener=lambda url: urllib.urlopen(url).read()) 
>>> d = pq(filename=path_to_html_file) 
>>> d("#hello") 
[<p#hello.hello>] 
>>> p = d("#hello") 
>>> p.html() 
'Hello world !' 
>>> p.html("you know <a href='http://python.org/'>Python</a> rocks") 
[<p#hello.hello>] 
>>> p.html() 
u'you know <a href="http://python.org/">Python</a> rocks' 
>>> p.text() 
'you know Python rocks'