2016-04-24 57 views
0

我目前正在研究一個沒有任何框架的webscraper,並且遇到了一個問題,我測試了一個xpath xpression,例如在維基百科頁面上獲取表數據。但是,當我刮並將其打印到控制檯時,它只會返回一個空列表。任何人都可以請指教?並可能會建議一些有用的書籍在xpath的webscraping? (我有safaribooks的幫助)用Python的路徑表達式創建列表

import requests 
from lxml import html 

page = requests.get('https://en.wikipedia.org/wiki/L.A.P.D._(band)') 
tree = html.fromstring(page.content) 

# OK 
bandName = tree.xpath('//*[@id="firstHeading"]/text()') 
overview = tree.xpath('//*[@id="mw-content-text"]/p[1]//text()') 
print(bandName) 
print(overview) 


#Trouble Code 
yearsActive = tree.xpath('//*[@id="mw-content-text"]/table[1]/tbody/tr[6]//text()') 
print(yearsActive) 
members = tree.xpath('//*[@id="mw-content-text"]/table[1]/tbody/tr[11]/td[1]/ul/li/a//text()') 
print(members) 

UPDATE:,同時進行更多的測試,我發現print(len(members))回報爲零,這似乎預示着什麼不對我的XPath表達式,但測試我的會員在Chrome控制檯時的表情它返回樂隊成員列表。

+0

是否有原因處理HTML而不是頁面的實際數據? –

+0

我不確定如何「處理實際數據」。一般來說,我對使用xpath和拼音很陌生。你能解釋我如何處理實際數據? – user502301

+0

** yearsActive **和**會員**僅爲空。你的意思是所有變量都是空的@ user502301 – wrufesh

回答

1

您的XPath失敗,因爲原始HTML表格沒有tbody。可能是由瀏覽器生成在這種情況下,tbody元素(見下文相關的問題):

>>> yearsActive = tree.xpath('//*[@id="mw-content-text"]/table[1]/tr[6]/td/text()') 
>>> print yearsActive 
[u'1989\u20131992'] 
>>> members = tree.xpath('//*[@id="mw-content-text"]/table[1]/tr[10]/td[1]//text()[normalize-space()]') 
>>> print members 
['James Shaffer', 'Reginald Arvizu', 'David Silveria', '\nRichard Morrill', '\nPete Capra', '\nCorey (surname unknown)', '\nDerek Campbell', '\nTroy Sandoval', '\nJason Torres', '\nKevin Guariglia'] 

在未來,它常常是有用的檢查,你實際上是從requests.get()接收,如果HTML你的XPath意外故障時,從代碼運行,但從瀏覽器工具運行時,運行良好。

相關:Why does my XPath query (scraping HTML tables) only work in Firebug, but not the application I'm developing?

+0

嘿@ har07,你建議一種特殊的方式來做到這一點嗎?感謝您的幫助! – user502301

+0

我沒有特別的方法來抓取網頁,我可以建議。我只是建議學習XPath,我發現它足夠強大,可以找到HTML的任何部分。 – har07