1. 程式人生 > >網路爬蟲中CSS選擇器的使用(BeautifulSoup)

網路爬蟲中CSS選擇器的使用(BeautifulSoup)

我利用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