Pergunta

Eu estou tentando raspar http://www.co.jefferson.co.us/ ats / displaygeneral.do? SCH = 000104 e obter o "dono Nome (s)" O que eu tenho obras, mas é realmente feio e não o melhor que eu tenho certeza que, assim que eu estou procurando uma maneira melhor. Aqui está o que eu tenho:

soup = BeautifulSoup(url_opener.open(url))            
x = soup('table', text = re.compile("Owner Name"))
print 'And the owner is', x[0].parent.parent.parent.tr.nextSibling.nextSibling.next.next.next

O HTML relevante é

<td valign="top">
    <table border="1" cellpadding="1" cellspacing="0" align="right">
    <tbody><tr class="tableheaders">
    <td>Owner Name(s)</td>
    </tr>

    <tr>

    <td>PILCHER DONALD L                         </td>
    </tr>

    </tbody></table>
</td>

Wow, há muitas perguntas sobre BeautifulSoup, olhei através deles, mas não encontrou uma resposta que me ajudou, espero que isto não é uma questão duplicado

Foi útil?

Solução

( Editar : aparentemente, o HTML do OP postou mentiras - não há de fato nenhuma marca tbody que procurar, mesmo que ele fez questão de incluir nesse HTML Então, mudando para. uso table vez de tbody).

Como pode haver várias mesa de linhas que deseja (por exemplo, ver a URL irmão ao que você dá, com o último dígito, 4, transformado em um 5), eu sugiro um loop, tais como o seguinte:

# locate the table containing a cell with the given text
owner = re.compile('Owner Name')
cell = soup.find(text=owner).parent
while cell.name != 'table': cell = cell.parent
# print all non-empty strings in the table (except for the given text)
for x in cell.findAll(text=lambda x: x.strip() and not owner.match(x)):
  print x

este é razoavelmente robusta para pequenas alterações na estrutura da página: ter localizado a célula de interesse, ele faz um loop até seus pais até que seja encontrada a marca de tabela, em seguida, sobre todas as cordas navegáveis ??dentro dessa tabela que não está vazio (ou apenas espaços em branco ), excluindo o cabeçalho owner.

Outras dicas

Esta é a resposta de Aaron DeVore do grupo de discussão BeautifulSoup, Ele funciona bem para mim.

soup = BeautifulSoup(...)
label = soup.find(text="Owner Name(s)")

Precisa Tag.string para chegar à cadeia de nome real

name = label.findNext('td').string

Se você está fazendo um monte deles, você pode até mesmo ir para uma compreensão da lista.

names = [unicode(label.findNext('td').string) for label in
soup.findAll(text="Owner Name(s)")]

Esta é uma ligeira melhoria, mas eu não conseguia descobrir como se livrar dos três pais.

x[0].parent.parent.parent.findAll('td')[1].string
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top