Este artigo apresenta como usar o Beautiful Soup. Este módulo é usado para analisar o html e sua operação é muito simples e fácil de usar.
Este é um módulo de terceiros que precisa ser instalado
instalação do pip beautifulsoup4 instalação do pip lxml
Belo objeto de sopa
Beautiful converte documentos HTML complexos em uma estrutura de árvore complexa, cada nó é um objeto python e todos os objetos podem ser resumidos em 4 tipos:
Tag
Tag, obtenha conteúdo através da tag html. Por exemplo, uma tag, se houver várias, pegue a primeira
html = "" " <html><head><title>Baidu</title> </head> <body> <div> <p class =" content "> 搜索 <a href =" http://www.baidu .com "class =" link "id =" link1 "> <! - 首页 -> </a>, <a href =" http://www.baidu.com/page/3.html "class = "link" id = "link2"> 搜索 1 </a> e <a href="http://www.baidu.com/page/47.html" class="link" id="link3"> 搜索 2 </a>; 请 点击 的 的 链接. </p> <p class = "content">. 这 是 广告 植入. </p> <p class = "title"> 百度 </p> </ div > </body> </html> """ obj = BeautifulSoup (html, 'lxml') # Seguido da especificação do uso da análise lxml, a velocidade da análise lxml é relativamente rápida e a tolerância a falhas é alta. print (obj.prettify ()) # saída formatada html print (obj.title) # aidu. com pega o conteúdo da tag title tag (obj.p) # tag possui dois atributos, um é nome e o outro é attr # name, o atributo name é o nome da tag, por exemplo, a tag é o nome impresso é # attrs, attrs é o atributo dessa tag, por exemplo, os atributos da tag a acima são class, href, id, ele é um dicionário # Como attrs é um dicionário, você pode usar a chave para obter o valor print (obj.a.name) # o nome de uma etiqueta, que é uma impressão (obj.a.attrs) # o atributo de uma etiqueta, que é a classe href identifique-os e qual é o valor correspondente print (obj.a.attrs ['href']) # # Obtenha o atributo href da marca a, ou seja, http://www.baidu.com print (obj.a.attrs .get ('href')) # Como attrs é um dicionário, você também pode usar o método .get para obter o mesmo valor que os colchetes acima
NavigableString
Ou seja, o conteúdo e o texto em uma tag são obtidos, por exemplo, o conteúdo na tag de título acima é obtido
print (obj.title.string) #Baidu print (obj.a.string) # 首页 print (tipo (obj.title.string)) # <classe 'bs4.element.NavigableString'> NavigableString
Beautifulobj
O objeto Beautifulobj é representar o html inteiro, por exemplo, o objetivo acima é o objeto Beautifulobj, através do qual operar várias tags
print (type (obj)) #Beautifulobj objeto
Comente
O objeto Comment é um tipo especial de objeto NavigableString. Na verdade, o conteúdo de saída ainda não inclui o símbolo de comentário, mas se não for tratado adequadamente, poderá causar problemas inesperados no processamento de texto. Por exemplo, em uma tag acima, a página inicial é anotada.
print (obj.a.string) # Página inicial, não incluindo <! -> Comment print (type (obj.a.string)) # <class 'bs4.element.Comment'> Tipo de comentário # Na verdade, é O conteúdo do comentário, quando o retiramos da string, não há símbolo de comentário, então preste atenção aqui
Operações chave
O acima é obtido através de um determinado rótulo: se você deseja obter diretamente alguns rótulos, precisa usar outros métodos para obter determinados atributos.
Tags de pesquisa
# find_all method find_all (name, attrs, recursive, text, ** kwargs) # O método find_all é usado para pesquisar todas as tags atuais para determinar se elas atendem às condições de filtragem e, em caso afirmativo, retornar uma lista de impressão qualificada (obj.find_all (' p ')) # Encontre todas as tags p print (obj.find_all ([' a ',' p '])) # Encontre todas as tags aep # Especifique o atributo print (obj.find_all (id =' link1 ')) # Encontre print with id link1 (obj.find_all (id = ['link1', 'link2'])) # Encontre id com link1 e link2 # Como classe é uma palavra-chave em python, se você deseja encontrar o atributo de classe, não pode Escreva a classe diretamente, escreva class_ print (obj.find_all (classe _ = 'link')) # classe é link, imprima (obj.find_all (classe _ = ['link', 'conteúdo'])) # class is link and conent print (obj.find_all (attrs = ('class': 'link', 'id': 'link1'})) # Vários atributos também podem ser gravados diretamente em um dicionário, o nome do atributo é escrito como chave e o valor como valor print (obj.find_all ('p', class _ = 'content')) # Encontre a classe com o conteúdo da tag p print (type (obj.find (class _ = 'link'))) # # A diferença entre o método find e o método findall é que findall retornará todos os rótulos e os colocará em uma lista. # find method retorna um rótulo e encontra vários Se você quiser, pegue o primeiro. Outros usos são os mesmos
seletor de css
O seletor css é obter as tags html através do CSS para obter os elementos. É muito conveniente para as pessoas familiarizadas com o css usá-lo. No seletor css, "." Representa a classe selecionada, "#" representa o ID selecionado .
print ('p', obj.select ('p')) # selecione por rótulo print (obj.select ('a')) # selecione por rótulo print (obj.select ('. content')) # por nome da classe Selecione print (obj.select ('# link1')) # Selecione print (obj.select ('p .link')) por id # Combine pesquisa, encontre print (obj.select ('p com o título da classe sob a tag p # link1 ')) # Pesquisa combinada, localize a impressão com o ID do link no link p (obj.select (' a # link1 ')) # # Pesquisa combinada, localize o ID com link1 na tag a , Find print (obj.select ('p> a')) no mesmo nível # busca de combinação de tags, encontre a tag a sob a tag p print (obj.select ('a [class = link]')) # atributo search , Encontre a impressão (obj.select ( 'pa [href = http: //www.baidu.com/page/47.html]')) cuja classe está vinculada à marca a # # Use-a em combinação, na marca a sob a marca p Encontre href para http://www.baidu.com/page/47.html
Conteúdo do nó
O nó é como obter os vários nós do html, como outras divs no mesmo nível da div, as sub tags abaixo da div, etc.
# content tag O atributo .contents pode gerar os nós filhos da tag como uma lista. #children children é o mesmo que content, que também é para obter nós filhos, mas filhos não é uma lista, mas um gerador de impressão (obj.div.contents) # Obtenha todas as tags abaixo da div print (obj.div.children) #Este é um gerador, a impressão é um objeto gerador, se você deseja obtê-lo, deve fazer um loop para chil em obj.div.children: print (chil ) # Através do conteúdo e os filhos devem obter nós filhos, se você deseja obter os filhos e netos através dos descendentes # print (obj.descendants) e o resultado dessa aquisição também é um iterador # # nó pai e nó ancestral # # através de obj. a.parent pode obter as informações do nó pai # # O nó ancestral pode ser obtido através de obj.a.parents, o resultado retornado por esse método é uma lista, as informações do nó pai da marca a serão armazenadas na lista e o nó pai O nó pai de também é colocado na lista e, finalmente, o documento inteiro será colocado na lista, o último elemento de todas as listas e o penúltimo elemento são A informação é mantida documento inteiro # # irmão # # obj.a.next_siblings ficar atrás irmãos # obj.a.previous_siblings chegar na frente de irmão # obj.a.next_sibling Obter o próximo rótulo de irmão # obj.a.previous_sinbling Obter o rótulo de irmão anterior
Sumário
Falamos principalmente sobre como obter várias tags e elementos em html. A modificação e a exclusão não são gravadas, porque os rastreadores geralmente não precisam ser modificados e a obtenção de dados é suficiente. O find_all () e o seletor CSS são comumente usados.Se você estiver familiarizado com CSS, é recomendável usar o seletor CSS. A pesquisa por tag e o seletor de css são muito comuns aqui.