


Cara Python menggunakan perpustakaan Beautiful Soup (BS4) untuk menghuraikan HTML dan XML
1. Gambaran Keseluruhan Sup Cantik:
Beautiful Soup menyokong perpustakaan Python untuk mengekstrak data daripada fail HTML atau XML
Ia menyokong penghurai HTML dalam perpustakaan standard Python, dan juga menyokong beberapa; lxml penghurai pihak ketiga.
Beautiful Soup secara automatik menukar dokumen input kepada pengekodan Unikod dan dokumen output kepada pengekodan UTF-8.
Pemasangan:
pip install beautifulsoup4
Pilihan untuk memasang parser
pip install lxml
pip install html5lib
2. Penggunaan Mudah BeautifulSoup4
Andaikan terdapat Html sedemikian, kandungan khusus adalah seperti berikut :
<!DOCTYPE html> <html> <head> <meta content="text/html;charset=utf-8" http-equiv="content-type" /> <meta content="IE=Edge" http-equiv="X-UA-Compatible" /> <meta content="always" name="referrer" /> <link href="https://ss1.bdstatic.com/5eN1bjq8AAUYm2zgoY3K/r/www/cache/bdorz/baidu.min.css" rel="external nofollow" rel="stylesheet" type="text/css" /> <title>百度一下,你就知道 </title> </head> <body link="#0000cc"> <div id="wrapper"> <div id="head"> <div class="head_wrapper"> <div id="u1"> <a class="mnav" href="http://news.baidu.com" rel="external nofollow" name="tj_trnews">新闻 </a> <a class="mnav" href="https://www.hao123.com" rel="external nofollow" name="tj_trhao123">hao123 </a> <a class="mnav" href="http://map.baidu.com" rel="external nofollow" name="tj_trmap">地图 </a> <a class="mnav" href="http://v.baidu.com" rel="external nofollow" name="tj_trvideo">视频 </a> <a class="mnav" href="http://tieba.baidu.com" rel="external nofollow" rel="external nofollow" name="tj_trtieba">贴吧 </a> <a class="bri" href="//www.baidu.com/more/" rel="external nofollow" name="tj_briicon" >更多产品 </a> </div> </div> </div> </div> </body> </html>
mencipta objek beautifulsoup4:
from bs4 import BeautifulSoup file = open('./aa.html', 'rb') html = file.read() bs = BeautifulSoup(html, "html.parser") # 缩进格式 print(bs.prettify()) # 格式化html结构 print(bs.title) # print(bs.title.name) # 获取title标签的名称 :title print(bs.title.string) # 获取title标签的文本内容 : 百度一下,你就知道 print(bs.head) # 获取head标签的所有内容 : print(bs.div) # 获取第一个div标签中的所有内容 : print(bs.div["id"]) # 获取第一个div标签的id的值 : wrapper print(bs.a) # 获取第一个a标签中的所有内容 : <a href="http://news.baidu.com/" rel="external nofollow" target="_blank">新闻 </a> print(bs.find_all("a")) # 获取所有的a标签中的所有内容 : [....] print(bs.find(id="u1")) # 获取id="u1"的所有内容 : for item in bs.find_all("a"): # 获取所有的a标签,并遍历打印a标签中的href的值 : print(item.get("href")) for item in bs.find_all("a"): # 获取所有的a标签,并遍历打印a标签的文本值: print(item.get_text())
3. Empat jenis utama objek BeautifulSoup4
BeautifulSoup4 menukarkan dokumen HTML yang kompleks kepada struktur pokok yang kompleks, dan setiap nod ialah Objek Python. Semua objek boleh diringkaskan kepada 4 jenis: Tag, NavigableString, BeautifulSoup, Comment,
1: Tag
Tag hanyalah teg dalam HTML, contohnya: <🎜. >
print(bs.title) # 获取title标签的所有内容 print(bs.head) # 获取head标签的所有内容 print(bs.a) # 获取第一个a标签的所有内容 print(type(bs.a))# 类型
dua atribut penting, nama dan attr:
print(bs.name) # [document] #bs 对象本身比较特殊,它的 name 即为 [document] print(bs.head.name) # head #对于其他内部标签,输出的值便为标签本身的名称 print(bs.a.attrs) # 在这里,我们把 a 标签的所有属性打印输出了出来,得到的类型是一个字典。 print(bs.a['class']) ##还可以利用get方法,传入属性的名称,二者是等价的,等价 bs.a.get('class') bs.a['class'] = "newClass"# 可以对这些属性和内容等等进行修改 print(bs.a) del bs.a['class'] # 还可以对这个属性进行删除 print(bs.a)
print(bs.title.string) # 百度一下,你就知道 print(type(bs.title.string)) #
print(type(bs.name)) # print(bs.name) # [document] print(bs.attrs) # {}
Objek ulasan ialah jenis objek NavigableString khas, dan kandungan outputnya tidak termasuk simbol ulasan.
print(bs.a) # 此时不能出现空格和换行符,a标签如下: # print(bs.a.string) # 新闻 print(type(bs.a.string)) #
4. Sifat yang digunakan untuk melintasi pepohon dokumen
- .kandungan:
Dapatkan semua nod anak Teg dan kembalikan senarai
print(bs.head.contents) # tag的.contents属性可以将tag的子节点以列表的方式输出:[...] print(bs.head.contents[1]) # 用列表索引来获取它的某一个元素:
Salin selepas log masuk
- .
- kanak-kanak:
Dapatkan semua nod anak Tag dan kembalikan penjana
for child in bs.body.children: print(child)
Salin selepas log masuk
- .keturunan
: Dapatkan semua nod keturunan Tag
- .induk
: Dapatkan nod induk Tag
- .ibu bapa
: Dapatkan semua nod elemen induk secara rekursif dan kembalikan penjana
- .previous_sibling
: Dapatkan nod sebelumnya Teg semasa, atribut biasanya rentetan atau kosong, hasil sebenar ialah koma dan aksara baris baharu antara teg semasa dan teg sebelumnya
- .next_sibling
: Dapatkan nod seterusnya Teg semasa Atribut biasanya rentetan atau kosong Hasilnya ialah koma dan aksara baris antara teg semasa dan teg seterusnya
. - .previous_siblings
: Dapatkan semua sibling nod di atas Tag semasa dan kembalikan generator
- .next_siblings
: Dapatkan semua sibling nod di bawah Teg semasa , mengembalikan penjana
- .elemen_sebelumnya
: Mendapat objek yang dihuraikan terakhir (rentetan atau teg) semasa proses penghuraian, yang mungkin sama seperti previous_sibling, tetapi biasanya berbeza
- .next_element
: Mendapat objek yang dihuraikan seterusnya (rentetan atau teg) semasa proses penghuraian, yang mungkin sama dengan next_sibling, tetapi biasanya Berbeza
- .elemen_sebelumnya
: Mengembalikan penjana yang boleh memajukan mengakses kandungan yang dihuraikan dokumen
- .next_elements
: Mengembalikan penjana yang boleh mengakses kandungan yang dihuraikan dokumen ke belakang
- .strings
: Jika Tag mengandungi berbilang rentetan, Iaitu, jika terdapat kandungan dalam nod keturunan, anda boleh menggunakan ini untuk mendapatkannya, dan kemudian melintasi
- .stripped_strings
: Penggunaannya sama seperti rentetan, tetapi yang berlebihan boleh dialih keluar Kandungan kosong
- .has_attr:
Tentukan sama ada Tag mengandungi atribut
5. Cari pepohon dokumen
1. find_all(): Penapis
find_all(name, attrs, recursive, text, **kwargs):
penapis find_all boleh digunakan dalam nama teg, atribut nod, dsb.
(1) parameter nama:
Penapisan rentetan: akan mencari kandungan yang betul-betul sepadan dengan rentetan a_list = bs.find_all("a")
print(a_list)
Jika ungkapan biasa dihantar masuk, BeautifulSoup4 akan memadankan kandungan melalui carian()import re
t_list = bs.find_all(re.compile("a"))
for item in t_list:
print(item)
: Jika senarai diluluskan, BeautifulSoup4 akan memadankan kandungan dengan senarai nod dipadankan dengan mana-mana elemen dalam pulangan t_list = bs.find_all(["meta","link"])
for item in t_list:
print(item)
: lulus dalam kaedah dan padankan mengikut kaedah 并不是所有的属性都可以使用上面这种方式进行搜索,比如HTML的data-*属性: 如果执行这段代码,将会报错。我们可以使用attrs参数,定义一个字典来搜索包含特殊属性的tag: 通过text参数可以搜索文档中的字符串内容,与name参数的可选值一样,text参数接受 字符串,正则表达式,列表 当我们搜索text中的一些特殊属性时,同样也可以传入一个方法来达到我们的目的: 可以传入一个limit参数来限制返回的数量,当搜索出的数据量为5,而设置了limit=2时,此时只会返回前2个数据 find_all除了上面一些常规的写法,还可以对其进行一些简写: find()将返回符合条件的第一个Tag,有时我们只需要或一个Tag时,我们就可以用到find()方法了。当然了,也可以使用find_all()方法,传入一个limit=1,然后再取出第一个值也是可以的,不过未免繁琐。 从结果可以看出find_all,尽管传入了limit=1,但是返回值仍然为一个列表,当我们只需要取一个值时,远不如find方法方便。但是如果未搜索到值时,将返回一个None。 在上面介绍BeautifulSoup4的时候,我们知道可以通过bs.div来获取第一个div标签,如果我们需要获取第一个div下的第一个div,我们可以这样: BeautifulSoup支持部分的CSS选择器,在Tag获取BeautifulSoup对象的.select()方法中传入字符串参数,即可使用CSS选择器的语法找到Tag: Atas ialah kandungan terperinci Cara Python menggunakan perpustakaan Beautiful Soup (BS4) untuk menghuraikan HTML dan XML. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!def name_is_exists(tag):
return tag.has_attr("name")
t_list = bs.find_all(name_is_exists)
for item in t_list:
print(item)
(2)kwargs参数:
t_list = bs.find_all(id="head") # 查询id=head的Tag
t_list = bs.find_all(href=re.compile(http://news.baidu.com)) # 查询href属性包含ss1.bdstatic.com的Tag
t_list = bs.find_all(class_=True) # 查询所有包含class的Tag(注意:class在Python中属于关键字,所以加_以示区别)
for item in t_list:
print(item)
(3)attrs参数:
t_list = bs.find_all(data-foo="value")
t_list = bs.find_all(attrs={"data-foo":"value"})
for item in t_list:
print(item)
(4)text参数:
t_list = bs.find_all(text="hao123")
t_list = bs.find_all(text=["hao123", "地图", "贴吧"])
t_list = bs.find_all(text=re.compile("\d"))
def length_is_two(text):
return text and len(text) == 2
t_list = bs.find_all(text=length_is_two)
(5)limit参数:
t_list = bs.find_all("a",limit=2)
# 下面两者是相等的
t_list = bs.find_all("a")
t_list = bs("a")
# 下面两者是相等的
t_list = bs.a.find_all(text="新闻")
t_list = bs.a(text="新闻")
2、find()
t_list = bs.find_all("title",limit=1) # 返回只有一个结果的列表
t = bs.find("title") # 返回唯一值
t = bs.find("abc") # 如果没有找到,则返回None
t = bs.div.div
# 等价于
t = bs.find("div").find("div")
六、CSS选择器:select()方法
print(bs.select('title')) # 1、通过标签名查找
print(bs.select('a'))
print(bs.select('.mnav')) # 2、通过类名查找
print(bs.select('#u1')) # 3、通过id查找
print(bs.select('div .bri')) # 4、组合查找
print(bs.select('a[class="bri"]')) # 5、属性查找
print(bs.select('a[href="http://tieba.baidu.com" rel="external nofollow" rel="external nofollow" ]'))
print(bs.select("head > title")) # 6、直接子标签查找
print(bs.select(".mnav ~ .bri")) # 7、兄弟节点标签查找
print(bs.select('title')[0].get_text()) # 8、获取内容
七、综合实例:
from bs4 import BeautifulSoup
import requests,re
req_obj = requests.get('https://www.baidu.com')
soup = BeautifulSoup(req_obj.text,'lxml')
'''标签查找'''
print(soup.title) #只是查找出第一个
print(soup.find('title')) #效果和上面一样
print(soup.find_all('div')) #查出所有的div标签
'''获取标签里的属性'''
tag = soup.div
print(tag['class']) #多属性的话,会返回一个列表
print(tag['id']) #查找标签的id属性
print(tag.attrs) #查找标签所有的属性,返回一个字典(属性名:属性值)
'''标签包的字符串'''
tag = soup.title
print(tag.string) #获取标签里的字符串
tag.string.replace_with("哈哈") #字符串不能直接编辑,可以替换
'''子节点的操作'''
tag = soup.head
print(tag.title) #获取head标签后再获取它包含的子标签
'''contents 和 .children'''
tag = soup.body
print(tag.contents) #将标签的子节点以列表返回
print([child for child in tag.children]) #输出和上面一样
'''descendants'''
tag = soup.body
[print(child_tag) for child_tag in tag.descendants] #获取所有子节点和子子节点
'''strings和.stripped_strings'''
tag = soup.body
[print(str) for str in tag.strings] #输出所有所有文本内容
[print(str) for str in tag.stripped_strings] #输出所有所有文本内容,去除空格或空行
'''.parent和.parents'''
tag = soup.title
print(tag.parent) #输出便签的父标签
[print(parent) for parent in tag.parents] #输出所有的父标签
'''.next_siblings 和 .previous_siblings
查出所有的兄弟节点
'''
'''.next_element 和 .previous_element
下一个兄弟节点
'''
'''find_all的keyword 参数'''
soup.find_all(id='link2') #查找所有包含 id 属性的标签
soup.find_all(href=re.compile("elsie")) #href 参数,Beautiful Soup会搜索每个标签的href属性:
soup.find_all(id=True) #找出所有的有id属性的标签
soup.find_all(href=re.compile("elsie"), id='link1') #也可以组合查找
soup.find_all(attrs={"属性名": "属性值"}) #也可以通过字典的方式查找
八、BeautifulSoup 和lxml(Xpath)对比
# test.py
# -*- coding: utf-8 -*-
import requests
from bs4 import BeautifulSoup, SoupStrainer
import traceback
import json
from lxml import etree
import re
import time
def getHtmlText(url):
try:
r = requests.get(url, headers=headers)
r.raise_for_status()
if r.encoding == 'ISO-8859-1':
r.encoding = r.apparent_encoding
return r.text
except:
traceback.print_exc()
# ----------使用BeautifulSoup解析------------------------
def parseWithBeautifulSoup(html_text):
soup = BeautifulSoup(html_text, 'lxml')
content = []
for mulu in soup.find_all(class_='mulu'): # 先找到所有的 div class=mulu 标记
# 找到div_h3 标记
h3 = mulu.find('h3')
if h3 != None:
h3_title = h3.string # 获取标题
lst = []
for a in mulu.select('div.box a'):
href = a.get('href') # 找到 href 属性
box_title = a.get('title') # 找到 title 属性
pattern = re.compile(r'\s*\[(.*)\]\s+(.*)') # (re) 匹配括号内的表达式,也表示一个组
match = pattern.search(box_title)
if match != None:
date = match.group(1)
real_title = match.group(2)
lst.append({'href':href,'title':real_title,'date':date})
content.append({'title':h3_title,'content':lst})
with open('dmbj_bs.json', 'w') as fp:
json.dump(content, fp=fp, indent=4)
# ----------使用Xpath解析------------------------
def parseWithXpath(html_text):
html = etree.HTML(html_text)
content = []
for div_mulu in html.xpath('.//*[@class="mulu"]'): # 先找到所有的 div class=mulu 标记
# 找到所有的 div_h3 标记
div_h3 = div_mulu.xpath('./div[@class="mulu-title"]/center/h3/text()')
if len(div_h3) > 0:
h3_title = div_h3[0] # 获取标题
a_s = div_mulu.xpath('./div[@class="box"]/ul/li/a')
lst = []
for a in a_s:
href = a.xpath('./@href')[0] # 找到 href 属性
box_title = a.xpath('./@title')[0] # 找到 title 属性
pattern = re.compile(r'\s*\[(.*)\]\s+(.*)') # (re) 匹配括号内的表达式,也表示一个组
match = pattern.search(box_title)
if match != None:
date = match.group(1)
real_title = match.group(2)
lst.append({'href':href,'title':real_title,'date':date})
content.append({'title':h3_title,'content':lst})
with open('dmbj_xp.json', 'w') as fp:
json.dump(content, fp=fp, indent=4)
def main():
html_text = getHtmlText('http://www.seputu.com')
print(len(html_text))
start = time.clock()
parseWithBeautifulSoup(html_text)
print('BSoup cost:', time.clock()-start)
start = time.clock()
parseWithXpath(html_text)
print('Xpath cost:', time.clock()-start)
if __name__ == '__main__':
user_agent = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.117 Safari/537.36'
headers={'User-Agent': user_agent}
main()

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Htmlisnotaprogramminglanguage; itisamarkuplanguage.1) htmlstructuresandformatswebcontentusingtags.2) itworkswithcssforstylingandjavascriptforinteractivity, meningkatkan pembangunan semula.

PHP dan Python mempunyai kelebihan dan kekurangan mereka sendiri, dan pilihannya bergantung kepada keperluan projek dan keutamaan peribadi. 1.PHP sesuai untuk pembangunan pesat dan penyelenggaraan aplikasi web berskala besar. 2. Python menguasai bidang sains data dan pembelajaran mesin.

Python dan JavaScript mempunyai kelebihan dan kekurangan mereka sendiri dari segi komuniti, perpustakaan dan sumber. 1) Komuniti Python mesra dan sesuai untuk pemula, tetapi sumber pembangunan depan tidak kaya dengan JavaScript. 2) Python berkuasa dalam bidang sains data dan perpustakaan pembelajaran mesin, sementara JavaScript lebih baik dalam perpustakaan pembangunan dan kerangka pembangunan depan. 3) Kedua -duanya mempunyai sumber pembelajaran yang kaya, tetapi Python sesuai untuk memulakan dengan dokumen rasmi, sementara JavaScript lebih baik dengan MDNWebDocs. Pilihan harus berdasarkan keperluan projek dan kepentingan peribadi.

Docker menggunakan ciri -ciri kernel Linux untuk menyediakan persekitaran berjalan yang cekap dan terpencil. Prinsip kerjanya adalah seperti berikut: 1. Cermin digunakan sebagai templat baca sahaja, yang mengandungi semua yang anda perlukan untuk menjalankan aplikasi; 2. Sistem Fail Kesatuan (Unionfs) menyusun pelbagai sistem fail, hanya menyimpan perbezaan, menjimatkan ruang dan mempercepatkan; 3. Daemon menguruskan cermin dan bekas, dan pelanggan menggunakannya untuk interaksi; 4. Ruang nama dan cgroups melaksanakan pengasingan kontena dan batasan sumber; 5. Pelbagai mod rangkaian menyokong interkoneksi kontena. Hanya dengan memahami konsep -konsep teras ini, anda boleh menggunakan Docker dengan lebih baik.

Python cemerlang dalam automasi, skrip, dan pengurusan tugas. 1) Automasi: Sandaran fail direalisasikan melalui perpustakaan standard seperti OS dan Shutil. 2) Penulisan Skrip: Gunakan Perpustakaan Psutil untuk memantau sumber sistem. 3) Pengurusan Tugas: Gunakan perpustakaan jadual untuk menjadualkan tugas. Kemudahan penggunaan Python dan sokongan perpustakaan yang kaya menjadikannya alat pilihan di kawasan ini.

Dalam kod VS, anda boleh menjalankan program di terminal melalui langkah -langkah berikut: Sediakan kod dan buka terminal bersepadu untuk memastikan bahawa direktori kod selaras dengan direktori kerja terminal. Pilih arahan Run mengikut bahasa pengaturcaraan (seperti python python your_file_name.py) untuk memeriksa sama ada ia berjalan dengan jayanya dan menyelesaikan kesilapan. Gunakan debugger untuk meningkatkan kecekapan debug.

CentOS Memasang Nginx memerlukan mengikuti langkah-langkah berikut: memasang kebergantungan seperti alat pembangunan, pcre-devel, dan openssl-devel. Muat turun Pakej Kod Sumber Nginx, unzip dan menyusun dan memasangnya, dan tentukan laluan pemasangan sebagai/usr/local/nginx. Buat pengguna Nginx dan kumpulan pengguna dan tetapkan kebenaran. Ubah suai fail konfigurasi nginx.conf, dan konfigurasikan port pendengaran dan nama domain/alamat IP. Mulakan perkhidmatan Nginx. Kesalahan biasa perlu diberi perhatian, seperti isu ketergantungan, konflik pelabuhan, dan kesilapan fail konfigurasi. Pengoptimuman prestasi perlu diselaraskan mengikut keadaan tertentu, seperti menghidupkan cache dan menyesuaikan bilangan proses pekerja.

Sambungan kod VS menimbulkan risiko yang berniat jahat, seperti menyembunyikan kod jahat, mengeksploitasi kelemahan, dan melancap sebagai sambungan yang sah. Kaedah untuk mengenal pasti sambungan yang berniat jahat termasuk: memeriksa penerbit, membaca komen, memeriksa kod, dan memasang dengan berhati -hati. Langkah -langkah keselamatan juga termasuk: kesedaran keselamatan, tabiat yang baik, kemas kini tetap dan perisian antivirus.
