2015-07-18 64 views
2
from bs4 import BeautifulSoup 
import requests 
s=requests.Session() 
r=s.get('http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8') 
soup=BeautifulSoup(r.text,'html5lib') 

DataGrid=soup.find('tbody') 
test=[] 
for tr in DataGrid.find_all('tr')[:3]: 
     for td in tr.find_all('td'): 
      print td.string 

嗨,我試圖解析本網站(http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8)的html和獲取表數據。我想從結果中排除前三個錶行,但由於某些原因,我無法讓解析器執行此操作。這是我的第一次專業拼搶嘗試,我完全喪失瞭如何獲得這項工作。我猜測這可能與我正在使用的html5lib解析器有關,但誠實的我不知道。有人可以告訴我,我怎麼能得到這個工作?BeautifulSoup迭代不工作

作爲一個很好的測試,將前三行的數據拉到非常有用。這樣我可以確信完成的查詢將從除這些之外的任何地方拉出。

例如在表的第一行會「馬術網站」

+0

添加你認爲的前三行 –

回答

1

你正在服用剛剛前三沒有忽視[:3],該切片從列表中前三個元素

DataGrid.find_all('tr')[:3] # first three elements 

應該DataGrid.find_all('tr')[3:]#所有,但前三個元素

from bs4 import BeautifulSoup 
import requests 

r=requests.get('http://www.virginiaequestrian.com/main.cfm?action=greenpages&GPType=8') 
soup=BeautifulSoup(r.content) 

tbl = soup.find("table") 
for tag in tbl.find_all("tr")[3:]: 
    for td in tag.find_all('td'): 
     print td.text 

上述tbl.find_all("tr")切片,用在兩個不同的解析器輸出:

In [20]: soup=BeautifulSoup(r.content,"html.parser") 

In [21]: tbl = soup.find("table") 

In [22]: len(tbl.find_all("tr")) 
Out[22]: 364 

In [23]: len(tbl.find_all("tr")[3:]) 
Out[23]: 361 

In [24]: soup=BeautifulSoup(r.content,"lxml") 

In [25]: tbl = soup.find("table") 

In [26]: len(tbl.find_all("tr")[3:]) 
Out[26]: 361 

In [27]: len(tbl.find_all("tr")) 
Out[27]: 364 

如果你真的想要的more的HREFs那麼你應該正是這樣做的,得到了​​a標籤爲每個tr,也有6分TR的排前你真正想要,所以你需要跳過6:

tbl = soup.find("table") 
out = (tag.find('a') for tag in tbl.find_all("tr")[6:]) 

for a in out: 
    print(a["href"]) 

輸出:

main.cfm?action=greenpages&sub=view&ID=9068 
main.cfm?action=greenpages&sub=view&ID=9504 
main.cfm?action=greenpages&sub=view&ID=10868 
main.cfm?action=greenpages&sub=view&ID=10261 
main.cfm?action=greenpages&sub=view&ID=10477 
main.cfm?action=greenpages&sub=view&ID=10708 
main.cfm?action=greenpages&sub=view&ID=11712 
main.cfm?action=greenpages&sub=view&ID=12402 
main.cfm?action=greenpages&sub=view&ID=12496 
.................. 

若要使用的鏈接只是在前面加上主網址:

for a in out: 
    print("http://www.virginiaequestrian.com/{}".format(a["href"])) 

輸出:

http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=9068 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=9504 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=10868 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=10261 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=10477 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=10708 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=11712 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=12402 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=12496 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=12633 
http://www.virginiaequestrian.com/main.cfm?action=greenpages&sub=view&ID=13528 

,如果你打開馬術網站第一個將引領你的,即你希望第一個數據,。

+0

是的,我做到了這一點,因爲表中有很多元素,我想測試片是否工作。我改變了一堆數字,我沒有看到它有什麼影響。我總是收回完整列表.... – user3590113

+0

它適合我,試着改變你的解析器,你確定打印DataGrid.find_all('tr')[:3]'和'DataGrid.find_all('tr') '給你完全一樣的輸出? –

+0

如果我使用默認或'lxml'我得到一個NoneType錯誤。這就是爲什麼我必須使用html5lib。我印刷數據網格= soup.find( 'TBODY') 測試= [] 爲TR在DataGrid.find_all( 'TR'): \t \t用於tr.find_all TD( 'TD'): \t \t \t打印td.text \t \t \t測試。附加(td) print'\ n%i'%len(test)and including [:3]我得到了3601的計數。如果我不包含切片器,我得到了5399的計數......哪現在提出一個問題,爲什麼用一個364元素的桌子,前三個元素構成了一半以上的數量...... – user3590113