2015-12-19 229 views
1

爲了教育目的,我試圖在Python中使用lxml和請求來掃描this pagePython lxml xpath無輸出

具體而言,我只是想打印頁面上所有教授的研究領域。 這是我迄今爲止所做的

import requests 
from lxml import html 

response=requests.get('http://cse.iitkgp.ac.in/index.php?secret=d2RkOUgybWlNZzJwQXdLc28wNzh6UT09') 
parsed_body=html.fromstring(response.content) 

for row in parsed_body.xpath('//div[@id="maincontent"]//tr[position() mod 2 = 1]'): 
    for column in row.xpath('//td[@class="fcardcls"]/tr[2]/td/font/text()'):   
     print column.strip()  

但它不打印任何東西。我用xpaths掙扎了很多,並且在chrome中主要使用了copy xpath功能。我遵循以下SO問題/答案的內容,並清理了我的代碼,並在xpaths中清除了'tbody'。代碼仍然返回空白。

1. Empty List Returned

2. Python-lxml-xpath problem

回答

2

首先,將具有所需數據的主內容內部從不同的端點經由XHR請求加載 - 模擬,在您的代碼。

下面是完整的工作代碼打印的名稱和研究領域的每名列表:

import requests 
from lxml import html 

response = requests.get('http://cse.iitkgp.ac.in/faculty4.php?_=1450503917634') 
parsed_body = html.fromstring(response.content) 

for row in parsed_body.xpath('.//td[@class="fcardcls"]'): 
    name = row.findtext(".//a[@href]/b") 
    name = ' '.join(name.split()) # getting rid of multiple spaces 

    research_areas = row.xpath('.//*[. = "Research Areas: "]/following-sibling::text()')[0].split(", ") 

    print(name, research_areas) 

這裏的想法是使用一個事實,即所有的「教授塊」位於td元素與class="fcardcls" 。對於每個塊,從粗體文本和Research Areas:加粗文本後面的字符串中獲取粗體鏈接文本和研究區域的名稱。

+0

您的代碼完美工作,我明白你寫的是什麼,謝謝。 現在,我有幾個問題: 1.你是如何找出主要內容頁面,即[這一個](http://cse.iitkgp.ac.in/faculty4.php?_=1450503917634) 2.在我的代碼中,我寫的xpath中有什麼錯誤?當我檢查鉻的「檢查」時,他們指出了正確的元素(研究領域)。 – humblenoob

+1

@humblenoob好吧,當然 - 1.我剛剛使用了瀏覽器開發工具,並檢查了頁面加載期間發送的請求; 2.你的代碼總體上是在正確的軌道上 - 至少有一點是,內部xpath表達式必須以一個點開始,以特定於上下文。希望答案有幫助。 – alecxe