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.
Posso confirmar que não há suporte para XPath no Beautiful Soup.
fonte
Como já foi dito, BeautifulSoup não tem suporte xpath. Provavelmente, existem várias maneiras de obter algo de um xpath, incluindo usando Selenium. No entanto, aqui está uma solução que funciona no Python 2 ou 3:
Usei isso como referência.
fonte
urllib2
uso da biblioteca para Python 3urllib.request
?BeautifulSoup tem uma função chamada findNext do elemento atual direcionado ao childern, então:
O código acima pode imitar o seguinte xpath:
fonte
Eu pesquisei seus documentos e parece que não há opção xpath. Além disso, como você pode ver aqui em uma questão semelhante no SO, o OP está pedindo uma tradução do xpath para o BeautifulSoup, então minha conclusão seria - não, não há análise do xpath disponível.
fonte
quando você usa lxml, tudo simples:
mas ao usar BeautifulSoup BS4 tudo simples também:
tente esta mágica:
como você vê, isso não suporta sub-tag, então eu removo a parte "/ @ href"
fonte
select()
é para seletores CSS, não é XPath. como você vê, isso não suporta subtags Embora eu não tenha certeza se isso era verdade na época, certamente não é agora.Talvez você possa tentar o seguinte sem XPath
fonte
Acima usou a combinação do objeto Sopa com lxml e pode-se extrair o valor usando xpath
fonte
Este é um tópico muito antigo, mas há uma solução alternativa agora, que pode não estar no BeautifulSoup na época.
Aqui está um exemplo do que fiz. Eu uso o módulo "solicitações" para ler um feed RSS e obter seu conteúdo de texto em uma variável chamada "rss_text". Com isso, eu o executo através do BeautifulSoup, procuro o xpath / rss / channel / title e recupero seu conteúdo. Não é exatamente XPath em toda a sua glória (curingas, caminhos múltiplos, etc.), mas se você tiver apenas um caminho básico que deseja localizar, isso funciona.
fonte