2016-07-30 64 views
0

這是我使用遍歷所有元素的代碼:美麗的湯未選擇任何元件

soup_top = bs4.BeautifulSoup(r_top.text, 'html.parser') 

selector = '#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a' 

for link in soup_top.select(selector): 
    print(link) 

在JavaScript中使用時,相同的選擇給出的57的長度:

document.querySelectorAll("#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a").length; 

我認爲,也許我沒有正確地獲取網頁的內容。然後我保存了網頁的本地副本,但Beautiful Soup中的選擇器仍然沒有選擇任何內容。這裏發生了什麼?

這是website我使用的是代碼。

+0

你能分享HTML嗎?沒有它,這將是很難看到發生了什麼事情。 –

+0

正如已經提到的,我們不知道沒有看到html –

+0

@Kristof我已經添加了一個鏈接到網站,我試圖刮。 –

回答

0

看來這是由於您使用的parser(即html.parser)。如果我嘗試同樣的事情lxml爲解析器:

from bs4 import BeautifulSoup 
import requests 

url = 'http://www.swapnilpatni.com/law_charts_final.php' 
r = requests.get(url) 
r.raise_for_status() 

soup = BeautifulSoup(r.text, 'lxml') 

css_select = '#ContentPlaceHolder1_gvDisplay table tr td:nth-of-type(3) a' 
links = soup.select(css_select) 
print('{} link(s) found'.format(len(links))) 

>> 1 link(s) found 

for link in links: 
    print(link['href']) 

>> spadmin/doc/Company Law amendment 1.1.png 

html.parser會返回一個結果,直到#ContentPlaceHolder1_gvDisplay table tr,而且當時它只返回第一個tr

當運行通過W3 Markup Validation Service的URL,這是返回的錯誤:

對不起,我無法驗證此文件,因爲上線1212它包含了,我不能解釋爲UTF一個或多個字節-8(換句話說,找到的字節在指定的字符編碼中不是有效值)。請檢查文件內容和字符編碼指示。 錯誤是:UTF8「\ XA0」不映射到Unicode

這很可能是html.parser扼流圈這個爲好,而lxml更容錯。

+0

謝謝kristof :) 通常使用'lxml'而不是'html.parser'更好嗎? –

+0

就像你在文檔中的比較表中看到的一樣,'lxml'很快(因爲它用C語言編寫)並且非常寬鬆。就我個人而言,我總是使用'lxml',但缺點是它會在您的項目中引入額外的外部依賴性。 –

+0

我得到錯誤'無法找到您請求的功能的樹生成器:lxml'。我想這是你的意思是外部依賴。我如何解決它? –