1. 程式人生 > >Python3爬蟲學習筆記(4.BeautifulSoup庫詳解)

Python3爬蟲學習筆記(4.BeautifulSoup庫詳解)

這是一個功能強大的庫,可以代替很多需要寫正則的地方

這是一個第三方解析庫,常規安裝方法:

調出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列
"""

相關推薦

no