2015-12-19 167 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