Não, o BeautifulSoup, por si só, não oferece suporte a expressões XPath.
Uma biblioteca alternativa, lxml , oferece suporte a XPath 1.0. Ele tem um modo compatível com BeautifulSoup, onde tentará analisar HTML corrompido da mesma forma que o Soup faz. No entanto, o analisador HTML lxml padrão faz um trabalho igualmente bom de analisar HTML quebrado, e acredito que seja mais rápido.
Depois de analisar seu documento em uma árvore lxml, você pode usar o .xpath()
método para pesquisar elementos.
try:
# Python 2
from urllib2 import urlopen
except ImportError:
from urllib.request import urlopen
from lxml import etree
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = urlopen(url)
htmlparser = etree.HTMLParser()
tree = etree.parse(response, htmlparser)
tree.xpath(xpathselector)
Também existe um módulo dedicadolxml.html()
com funcionalidade adicional.
Observe que, no exemplo acima, passei o response
objeto diretamente para lxml
, pois fazer com que o analisador leia diretamente do fluxo é mais eficiente do que ler a resposta em uma grande string primeiro. Para fazer o mesmo com a requests
biblioteca, você deseja definir stream=True
e passar o response.raw
objeto após ativar a descompressão de transporte transparente :
import lxml.html
import requests
url = "http://www.example.com/servlet/av/ResultTemplate=AVResult.html"
response = requests.get(url, stream=True)
response.raw.decode_content = True
tree = lxml.html.parse(response.raw)
De possível interesse para você é o suporte ao seletor CSS ; a CSSSelector
classe traduz as instruções CSS em expressões XPath, tornando sua pesquisa td.empformbody
muito mais fácil:
from lxml.cssselect import CSSSelector
td_empformbody = CSSSelector('td.empformbody')
for elem in td_empformbody(tree):
# Do something with these table cells.
Fechando o círculo: a própria BeautifulSoup não tem muito completo apoio seletor CSS :
for cell in soup.select('table#foobar td.empformbody'):
# Do something with these table cells.