網路爬蟲中CSS選擇器的使用(BeautifulSoup)
阿新 • • 發佈:2018-12-26
我利用CSS選擇器的原因是:我發現CSS選擇器來提取資訊的時候更加方便。。。
怎麼使用:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, 'html.parser')
soup.select()
BeautifulSoup物件的.select()方法中傳入字串引數,選擇的結果以列表形式返回.
css基本語法
元素選擇器: 直接選擇文件元素 比如head,p 類選擇器: 元素的class屬性,比如<h1 class="important"> 類名就是important .important選擇所有有這個類屬性的元素 可以結合元素選擇器,比如p.important ID選擇器: 元素的id屬性,比如<h1 id="intro"> id就是intro #intro用於選擇id=intro的元素 可以結合元素選擇器,比如p#intro 屬性選擇器: 選擇有某個屬性的元素,而不論值是什麼。 *[title]選擇所有包含title屬性的元素 a[href]選擇所有帶有href屬性的錨元素 還可以選擇多個屬性,比如:a[href][title],注意這裡是要同時滿足。 限定值:a[href="www.so.com"] 後代(包含)選擇器: 選擇某元素後代的元素(層級不受限制) 選擇h1元素的em元素:h1 em 子元素選擇器: 範圍限制在子元素 選擇h1元素的子元素strong:h1 > strong
例子
test.html <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>hjk</title> </head> <body> <p class="title" name="dromouse"><b>The Dormouse's story</b></p> <p class="story">Once upon a time there were three little sisters; and their names were <a href="http://example.com/elsie" title="12" class="sister" id="link1"><!-- Elsie --></a>, <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>; and they lived at the bottom of a well.</p> <p class="story">...</p> </body> </html>
解析網頁
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('test.html'), 'html.parser')
1.通過元素標籤查詢
1
print(soup.select('title')) # 選擇所有的titel標籤 print(soup.select('p')) # 選擇所有的p標籤 print(soup.select('p')[0]) # 選擇第一個p標籤 #輸出: [<title>hjk</title>] [<p class="title" name="dromouse"><b>The Dormouse's story</b></p>, <p class="story">Once upon a time there were three little sisters; and their names were <a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a> and <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>; and they lived at the bottom of a well.</p>, <p class="story">...</p>] <p class="title" name="dromouse"><b>The Dormouse's story</b></p>
2
print(soup.select('p a')) # 尋找p標籤的a標籤
print(soup.select('body a')) # 尋找body標籤下的a標籤
#輸出
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
3
print(soup.select('body > a')) # 尋找body標籤下子節點a標籤
print(soup.select('p > #link1')) # 尋找p標籤子節點中id='link1'的標籤
#輸出
[]
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>]
body > a 找的是子標籤
4
print(soup.select('#link1 ~ .sister')) # 尋找id='link1',class='sister'標籤的兄弟標籤
print(soup.select('#link1 + .sister')) # 尋找id='link1',class='sister'標籤的下一個兄弟標籤
#輸出
[<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
[<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
2.通過CSS類名查詢
print(soup.select('.sister')) # 獲得所有class為sister的標籤
print(soup.select('p.title')) # 獲得P標籤下class類名為title的標籤。
#輸出
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
[<p class="title" name="dromouse"><b>The Dormouse's story</b></p>]
3.通過標籤的id屬性查詢
print(soup.select('#link1')) # 尋找所有id='link1'的標籤
print(soup.select('#link1,#link2')) # 尋找所有id為link1或link2的標籤
#輸出
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>]
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
4.通過是否存在某個屬性來查詢
print(soup.select('a[href]')) # 查詢a標籤下存在herf屬性的標籤
#輸出
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
5.通過屬性的值來查詢
print(soup.select('a[href="http://example.com/elsie"]')) # 尋找a標籤中href="http://example.com/elsie"的標籤
print(soup.select('a[href^="http://example.com/"]')) # 尋找href屬性值是以"http://example.com/"開頭的a標籤
print(soup.select('a[href$="tillie"]'))#尋找href屬性值是以tillie為結尾的a標籤
print(soup.select('a[href*=".com/el"]'))#尋找href屬性值中存在字串”.com/el”的標籤a
#輸出
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>]
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>, <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
[<a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>]
6.通過標籤逐層查詢
Atag = soup.select('p')[1]
Btag = Atag.select('[title="12"]')
print(Btag)
#輸出
[<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>]
7.獲取屬性
a=soup.select('p #link2')
print(a[0].attrs['href'])
#輸出
<a class="sister" href="http://example.com/elsie" id="link1" title="12"><!-- Elsie --></a>
8.獲取文字
print(a[0].string)
#輸出
http://example.com/lacie