Pergunta

Eu sou novo para python, e eu preciso de alguma ajuda com a sintaxe para encontrar e interagindo através de tags HTML usando lxml. Aqui estão os casos de uso estou lidando com:

arquivo HTML é muito bem formado (mas não perfeito). Tem várias tabelas na tela, um contendo um conjunto de resultados de pesquisa, e cada um para um cabeçalho e rodapé. Cada linha do resultado contém um link para o detalhe resultado da pesquisa.

  1. Eu preciso encontrar o meio mesa com as linhas do resultado de pesquisa (esta eu era capaz de descobrir):

        self.mySearchTables = self.mySearchTree.findall(".//table")
        self.myResultRows = self.mySearchTables[1].findall(".//tr")
    
  2. Eu preciso encontrar os links contidos nesta tabela (isto é onde eu estou ficando preso):

        for searchRow in self.myResultRows:
            searchLink = patentRow.findall(".//a")
    

    Ele não parece realmente localizar os elementos de ligação.

  3. Eu preciso o texto simples do link. Eu imagino que seria algo como searchLink.text se eu realmente tenho os elementos de ligação em primeiro lugar.

Finalmente, na referência da API real para lxml, eu não era capaz de encontrar informações sobre a descoberta e as chamadas findall. Eu recolhi estes a partir de pedaços de código que encontrei no google. Estou faltando alguma coisa sobre como efetivamente encontrar e interagir sobre HTML tags de usar lxml?

Foi útil?

Solução

Ok, em primeiro lugar, no que diz respeito à análise do HTML: se você seguir a recomendação do zweiterlinde e S.Lott no uso menos a versão de BeautifulSoup incluído com lxml . Dessa forma, você também vai colher o benefício de um XPath ou css interface agradável selector.

No entanto, eu pessoalmente prefiro Ian Bicking HTML parser incluído no lxml .

Em segundo lugar, .find() e .findall() vêm de lxml tentando ser compatível com ElementTree, e esses dois métodos são descritos em Suporte XPath em ElementTree .

Essas duas funções são bastante fáceis de usar, mas eles são muito limitados XPath. Eu recomendo a tentar usar o completo lxml xpath() método ou, se você é já está familiarizado com CSS, usando o cssselect() método .

Aqui estão alguns exemplos, com uma cadeia de HTML analisado como este:

from lxml.html import fromstring
mySearchTree = fromstring(your_input_string)

Usando a classe seletor css seu programa seria mais ou menos parecido com este:

# Find all 'a' elements inside 'tr' table rows with css selector
for a in mySearchTree.cssselect('tr a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

A usando o método XPath equivalente seria:

# Find all 'a' elements inside 'tr' table rows with xpath
for a in mySearchTree.xpath('.//tr/*/a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

Outras dicas

Existe uma razão que você não está usando Beautiful Soup para este projeto? Isso fará com que lidar com documentos imperfeitamente formados muito mais fácil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top