BeautifulSoup obter o valor na tabela
-
08-07-2019 - |
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
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