我用python寫了一個爬取水木社區(http://www.newsmth.net/nForum/#!board/Python?p=1)的爬蟲,來爬取這一頁的每個帖子的鏈接,我用瀏覽器查看了每個帖子的鏈接放在<td class='title_9'> <td>和<td class='title_9 bg-odd'> <td>這樣的標簽里。我使用td=tbody.find_all('td',class_='title_9')可以回傳所有class='title_9'和class='title_9 bg-odd'的所有帖子,為什么class='title_9 bg-odd'的帖子也能找到? 我使用td=tbody.find_all('td',class_='title_9 bg-odd')時,卻回傳空,一個帖子也找不到。然后我print(tbody)把tbody的內容列印出來,發現列印出來的所有帖子都在<td class='title_9'> <td>里面,所有的class='title_9 bg-odd'都變成了class='title_9'了,為什么會這樣呢?為什么程式列印出來的tbody的內容和在瀏覽器上看到的不一樣?求大神幫忙解答一下,謝謝啦。
瀏覽器看到的:

程式輸出的:
uj5u.com熱心網友回復:
前端中<td class='title_9 bg-odd'> <td> ,這是兩個class他,“title_9”和“bg-odd”后端中td=tbody.find_all('td',class_='title_9 bg-odd') 這是一個class,“title_9 bg-odd”,中間的是空格,所以沒有匹配的。
uj5u.com熱心網友回復:
“title_9”和“bg-odd”不是在一個引號里面嗎?為什么是兩個class呢?
同一個網頁,我print(soup.find('table', class_='board-list tiz'))可以找到對應的內容啊,class內容也是有空格的。
uj5u.com熱心網友回復:
前端中<td class='title_9 bg-odd'> <td> ,這是兩個class屬性,find_all查一下這個方法的引數具體的資訊,我感覺怎么寫了兩個是個模糊查詢uj5u.com熱心網友回復:
那為啥class_='board-list tiz'就不是兩個class屬性呢?
uj5u.com熱心網友回復:
python中引號內的是字串,
我使用td=tbody.find_all('td',class_='title_9 bg-odd')時,卻回傳空, 這是你原帖子上的一句換,我用手機版CSDN看的時候發現 title_9和bg-odd之間有好多空格,所以沒有匹配到時空的,
下面的這個demo可以觀察分析一下
from bs4 import BeautifulSoup
html = """<body>
<tr class="top">
<td class="title_8">1</td>
<td class="title_9">2</td>
<td class="title_10">3</td>
<td class="title_11">4</td>
<td class="title_12">5</td>
</tr>
<tr class="top">
<td class="title_8 bg-odd">6</td>
<td class="title_9 bg-odd">7</td>
<td class="title_10 bg-odd">8</td>
<td class="title_11 bg-odd">9</td>
<td class="title_12 bg-odd">10</td>
<td class="title_11 middle bg-odd">11</td>
<td class="title_11 middle bg-odd">12</td>
<td class="title_11 middle bg-odd">13</td>
<td class="title_10 bg-odd">14</td>
<td class="title_12 bg-odd">15</td>
</tr>
</body>
"""
soup = BeautifulSoup(html, features='lxml')
td1 = soup.find_all('td', {'class': {'title_9 bg-odd'}})
print('td1>>>',td1)
td4 = soup.find_all('td', class_='title_9 bg-odd') # 這里只有一個空格時,可以查找到
print('td4>>>',td4)
td5 = soup.find_all('td', class_={'title_9 bg-odd'}) # 可以在帶# 的這行代碼中添加空號試一試
print('td5>>>',td5)
td6 = soup.find_all('td', class_=['title_9 bg-odd']) # 無論是哪種,引號內的都是字串
print('td6>>>',td6)
td7 = soup.find_all('td', class_=['title_9','bg-odd']) # 無論是哪種,引號內的都是字串
print('td7>>>',td7)
td2 = soup.find_all('td', {'class': 'title_9'})
print('td2>>>',td2)
td3 = soup.find_all('td', {'class': 'bg-odd'})
print('td3>>>',td3)
uj5u.com熱心網友回復:
是的,td2 = soup.find_all('td', {'class': 'title_9'})確實能夠回傳title_9和title_9 bg-odd這兩個class的資料。有一點不太明白的是,使用print(tbody),列印出來的資料中,前端看到的class='title_9 bg-odd'都變成了class='title_9'了,這是怎么回事?
uj5u.com熱心網友回復:
/quote]你的print(tbody) ,tbody是什么uj5u.com熱心網友回復:
這個:
uj5u.com熱心網友回復:
/quote]你的print(tbody) ,tbody是什么
這個:
![]()
uj5u.com熱心網友回復:
你在換個方式試一下 ![]()
uj5u.com熱心網友回復:
你在換個方式試一下
把text.html改為對應的網址嗎uj5u.com熱心網友回復:
text.html是我抓下來頁面保存的成了檔案,讀取這個檔案,讓后再查找uj5u.com熱心網友回復:
text.html是我抓下來頁面保存的成了檔案,讀取這個檔案,讓后再查找
這樣子就可以了,很奇怪,為什么會這樣呢?uj5u.com熱心網友回復:
text.html是我抓下來頁面保存的成了檔案,讀取這個檔案,讓后再查找
這樣子就可以了,很奇怪,為什么會這樣呢?
可能與bs4 的版本有關系吧uj5u.com熱心網友回復:
text.html是我抓下來頁面保存的成了檔案,讀取這個檔案,讓后再查找
這樣子就可以了,很奇怪,為什么會這樣呢?
可能與bs4 的版本有關系吧
我也是用bs4呀,為什么就不行呢?uj5u.com熱心網友回復:
text.html是我抓下來頁面保存的成了檔案,讀取這個檔案,讓后再查找
這樣子就可以了,很奇怪,為什么會這樣呢?
可能與bs4 的版本有關系吧
我也是用bs4呀,為什么就不行呢?
你查一下版本,或者換個電腦試一下或者重裝一下轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/43401.html
下一篇:Python第三方庫安裝

