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