这是一个功能强大的库,可以代替很多需要写正则的地方
这是一个第三方解析库,常规安装方法:
调出cmd:pip install bs4
简单了解:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>TITLE</title> </head> <body> <table border="1"> <tr>/ <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') #自动补全修正html文本 print(soup.prettify()) #获得html的标题 print(soup.title.string)
标签选择器:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>TITLE</title> </head> <body> <table border="1"> <tr>/ <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.title) #<title>TITLE</title> print(soup.head) ''' <head> <meta charset="utf-8"/> <title>TITLE</title> </head> ''' print(soup.td) #只能获取第一个,所以打印:<td>第一行,第1列</td>
获取属性:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr>/ <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.table["border"]) #1
获取内容:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.table.tr.td.string) #第一行,第1列
子节点:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.table.tr.contents) #['\n', <td>第一行,第1列</td>, '\n', <td>第一行,第2列</td>, '\n', <td>第一行,第3列</td>, '\n']另外一种:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') for i, child in enumerate(soup.table.tr.children): print(i, child) ''' 0 1 <td>第一行,第1列</td> 2 3 <td>第一行,第2列</td> 4 5 <td>第一行,第3列</td> 6 可以看出.children实际上是一个迭代器。 '''
子孙节点:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') for i, child in enumerate(soup.table.descendants): print(i, child) ''' 0 1 <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> 2 3 <td>第一行,第1列</td> 4 第一行,第1列 5 6 <td>第一行,第2列</td> 7 第一行,第2列 8 9 <td>第一行,第3列</td> 10 第一行,第3列 11 12 '''
父节点:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.tr.parent) ''' <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> '''
兄弟节点:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td>第一行,第1列</td> <td>第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(list(enumerate(soup.td.next_siblings))) #[(0, '\n'), (1, <td>第一行,第2列</td>), (2, '\n'), (3, <td>第一行,第3列</td>), (4, '\n')] print(list(enumerate(soup.td.previous_siblings))) #[(0, '\n')]
标准选择器(实用):
find_all详解:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table border="1"> <tr> <td id="1">第一行,第1列</td> <td class="c1">第一行,第2列</td> <td>第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.find_all("td")) #[<td>第一行,第1列</td>, <td>第一行,第2列</td>, <td>第一行,第3列</td>] #可以遍历输出,这里不写了(td标签里面的内容是后边临时加的) print(soup.find_all(attrs={"id": "1"})) #[<td id="1">第一行,第1列</td>](临时加的id) print(soup.find_all(id="1")) #[<td id="1">第一行,第1列</td>] print(soup.find_all(class_="c1")) #[<td class="c1">第一行,第2列</td>](临时加的class) #注意这里要加上下划线 print(soup.find_all(text="第一行,第3列")) #['第一行,第3列']
find方法类似,只不过是把find_all方法获取的列表里面的第一个元素拿出来了,这里就不仔细写了。
CSS选择器:
html = """ <html lang="en"><head> <meta charset="UTF-8"> <title>666</title> </head> <body> <table class="c0" border="1"> <tr id="0"> <td id="1">第一行,第1列</td> <td id="2" class="c1">第一行,第2列</td> <td id="3">第一行,第3列</td> </tr> </table> </body> </html>""" from bs4 import BeautifulSoup soup = BeautifulSoup(html, 'lxml') print(soup.select("tr td")) #[<td id="1">第一行,第1列</td>, <td class="c1">第一行,第2列</td>, <td>第一行,第3列</td>] print(soup.select(".c0 .c1")) #[<td class="c1">第一行,第2列</td>] print(soup.select("#0 .c1")) #[<td class="c1">第一行,第2列</td>] for td in soup.select("td"): print(td["id"]) #临时加入的三个id,会遍历输出1,2,3 for td in soup.select("td"): print(td.get_text()) """ 第一行,第1列 第一行,第2列 第一行,第3列 """