scrapy xpath返回空列表,而响应不为空

时间:2017-09-19 07:04:49

标签: python html xpath scrapy

我正在使用scrapy从website

上的2个表中抓取信息

我先刮掉桌子。事实证明,员工和学生都是空的,而反应并非空洞。我还在页面源中找到了表格选项卡。任何人都可以找出问题所在吗?

import scrapy
from universities.items import UniversitiesItem


class UniversityOfSouthCarolinaColumbia(scrapy.Spider):
    name = 'uscc'
    allowed_domains = ['sc.edu']
    start_urls = ['http://www.sc.edu/about/directory/?name=']

    def parse(self, response):    
        for ln in ['Zhao']:
            query = response.url + ln
            yield scrapy.Request(query, callback=self.parse_item)

    @staticmethod
    def parse_item(response):
        staffs = response.xpath('//table[@id="directorystaff"]/tbody/tr[@role="row"]')
        students = response.xpath('//table[@id="directorystudent"]/tbody/tr[@role="row"]')

        print('--------------------------')
        print('staffs', staffs)
        print('==========================')
        print('students', students)

1 个答案:

答案 0 :(得分:0)

这真是个很酷的问题。我正在调查此事。我得出的结论是,响应中不包含有关tags属性的信息。我认为浏览器是修改page_source_body,任何人都有脚本向标签添加属性。

作为回应,tr-tags没有属性' role'

请看:

             <table class="display" id="directorystaff" width="100%">
                <thead>
                <tr>
                  <th style="text-align: left">Name</th>
                  <th style="text-align: left">Email</th>
                  <th style="text-align: left">Phone</th>
                  <th style="text-align: left">Department</th>
                  <th style="text-align: left">Office Address</th>
                </tr>
              </thead>  
              <tbody>

                    <tr>
                        <td style="text-align: left">Zhao, Xia  &nbsp;</td>
                        <td style="text-align: left">&nbsp;</td>
                        <td style="text-align: left">(803) 777-8436&nbsp;</td>
                        <td style="text-align: left">Chemistry&nbsp;</td>
                        <td style="text-align: left">537&nbsp;</td>
                    </tr>

                    <tr>
                        <td style="text-align: left">Zhao, Xing  &nbsp;</td>
                        <td style="text-align: left">&nbsp;</td>
                        <td style="text-align: left">&nbsp;</td>
                        <td style="text-align: left">Mechanical Engineering&nbsp;</td>
                        <td style="text-align: left">&nbsp;</td>
                    </tr>

It response on request query

在此图片中,我们看到了响应页面 enter image description here

在这张图片中我们看到浏览器上的页面: enter image description here

所以,如果你想获得员工名单,我建议下一个XPath:

//table[@id="directorystaff"]/tbody/tr/td

enter image description here

对于学生,我建议下一个XPath:

//table[@id="directorystudent"]/tbody/tr/td

如果你想要别的东西,你可以修改这个是XPath查询。

这是你的例子:

import requests
from lxml import html
x = requests.get("https://www.sc.edu/about/directory/?name=Zhao")
ht = html.fromstring(x.text)
element = ht.xpath('//table[@id="directorystaff"]/tbody/tr/td')
for el in element:
    print(el.text)

输出:

>>Zhao, Xia   
>> 
>>(803) 777-8436 
>>Chemistry 
>>537 
>>Zhao, Xing   
>> 
>> 
>>Mechanical Engineering