各位大神
       我在抓取一个全是js加载的网站数据时,通过phantomjs解析得到html响应在返回lxml对象时报错.
网站是: http://data.champdas.com/match/scheduleDetail-1-2017-6.html
我的spider是:
import scrapy
from gooseeker import GsExtractor

class CslsaiguoSpider(scrapy.Spider):
    name = "cslsaiguo"
    allowed_domains = ["champdas.com"]
    start_urls = (
        'http://data.champdas.com/match/data-2772.html',
    )

    def parse(self, response):
        html = response.body
        # html = response.body.decode('gbk').encode().decode('utf-8')
        print(response.body.decode('gbk').encode().decode('utf8'))
        print("----------------------------------------------------------------------------")
        extra=GsExtractor()
        extra.setXsltFromAPI("356e75d4d09d77a2b60a058d77047847", "cslsaiguo")
        result = extra.extractHTML(html)
        print(result)
        file_name = 'C:/Users/deryk/csl/temp/cslsaiguo/1.xml'
        open(file_name,"wb").write(result)



gooseek.py中代码是
import time
from urllib import request
from urllib.parse import quote
from lxml import etree

class GsExtractor(object):
        def _init_(self):
                self.xslt = ""
        # 从文件读取xslt
        def setXsltFromFile(self , xsltFilePath):
                file = open(xsltFilePath , 'r' , encoding='UTF-8')
                try:
                        self.xslt = file.read()
                finally:
                        file.close()
        # 从字符串获得xslt
        def setXsltFromMem(self , xsltStr):
                self.xslt = xsltStr
        # 通过GooSeeker API接口获得xslt
        def setXsltFromAPI(self , APIKey , theme, middle=None, bname=None):
                apiurl = "http://www.gooseeker.com/api/getextractor?key="+ APIKey +"&theme="+quote(theme)
                if (middle):
                        apiurl = apiurl + "&middle="+quote(middle)
                if (bname):
                        apiurl = apiurl + "&bname="+quote(bname)
                apiconn = request.urlopen(apiurl)
                self.xslt = apiconn.read()
        # 返回当前xslt
        def getXslt(self):
                return self.xslt
        # 提取方法,入参是一个HTML DOM对象,返回是提取结果
        def extract(self , html):
                xslt_root = etree.XML(self.xslt)
                transform = etree.XSLT(xslt_root)
                result_tree = transform(html)
                return result_tree
        # 提取方法,入参是html源码,返回是提取结果
        def extractHTML(self , html):
                doc = etree.HTML(html)
                return self.extract(doc)

报的错误是
Traceback (most recent call last):
  File "c:\python36\lib\site-packages\twisted\internet\defer.py", line 653, in _runCallbacks
    current.result = callback(current.result, *args, **kw)
  File "C:\Users\Deryk\csl\sprots\sprots\spiders\cslsaiguo.py", line 24, in parse
    result = extra.extractHTML(html)
  File "C:\Users\Deryk\csl\sprots\gooseeker.py", line 50, in extractHTML
    return self.extract(doc)
  File "C:\Users\Deryk\csl\sprots\gooseeker.py", line 44, in extract
    transform = etree.XSLT(xslt_root)
  File "src\lxml\xslt.pxi", line 409, in lxml.etree.XSLT.__init__ (src\lxml\lxml.etree.c:177760)
lxml.etree.XSLTParseError: Failed to compile predicate

举报 使用道具
| 回复

共 8 个关于本帖的回复 最后回复于 2017-4-21 19:23

沙发
derykwang 初级会员 发表于 2017-4-21 12:56:00 | 只看该作者
抓取其他的网站时没有问题,就抓取这个网站时才报的错误,求大神来帮小弟解答下啊
举报 使用道具
板凳
shenzhenwan10 金牌会员 发表于 2017-4-21 14:48:50 | 只看该作者
derykwang 发表于 2017-4-21 12:56
抓取其他的网站时没有问题,就抓取这个网站时才报的错误,求大神来帮小弟解答下啊 ...

如果只是某个网站有报错, 那可能和网站的返回内容有关, 也可能是你的提取器有问题.
建议如下:
1. 在集搜客的谋数台里加载提取器对应的规则, 验证测试结果
2. 在程序中直接把返回内容显示出来或者存到一个文件里, 看看有什么特别
举报 使用道具
地板
derykwang 初级会员 发表于 2017-4-21 16:13:09 | 只看该作者
shenzhenwan10 发表于 2017-4-21 14:48
如果只是某个网站有报错, 那可能和网站的返回内容有关, 也可能是你的提取器有问题.
建议如下:
1. 在集搜 ...

我在谋数台里加载规则是测试是可以看到要抓的数据的(用DS打数台也可以得到想要的xml格式的数据),  返回的response.body也是已经经过phantomjs处理的数据.我现在的判断是:  我要抓取的这个网址的response.body不能被gooseeker.py中GsExtractor类的中的方法准确识别,也就是返回的response.body在被lxml转换成xml格式文件时出现了参数错误.  我不明白的是觉得如果是这个错误,DS打数台也拿不到数据.
图片是我用谋数台测试出的数据

捕获.PNG (67.33 KB, 下载次数: 305)

捕获.PNG
举报 使用道具
5#
derykwang 初级会员 发表于 2017-4-21 16:32:54 | 只看该作者
shenzhenwan10 发表于 2017-4-21 14:48
如果只是某个网站有报错, 那可能和网站的返回内容有关, 也可能是你的提取器有问题.
建议如下:
1. 在集搜 ...

大神, 有没有可能是谋数台用的lxml及twist版本和我安装的版本不一致造成的.我的是lxml 3.7.3,Twist 17.1.0, selenium3.0.2.
举报 使用道具
6#
Fuller 管理员 发表于 2017-4-21 16:45:18 | 只看该作者
derykwang 发表于 2017-4-21 16:32
大神, 有没有可能是谋数台用的lxml及twist版本和我安装的版本不一致造成的.我的是lxml 3.7.3,Twist 17.1. ...

似乎在解析XSL规则文件的时候就出错了,会不会这个解析器解析不了嵌套的XSL?
可以找一个很简单的网站,故意做一个嵌套整理箱,测试一下XSLT处理器能否处理嵌套情况
举报 使用道具
7#
derykwang 初级会员 发表于 2017-4-21 17:42:54 | 只看该作者
Fuller 发表于 2017-4-21 16:45
似乎在解析XSL规则文件的时候就出错了,会不会这个解析器解析不了嵌套的XSL?
可以找一个很简单的网站, ...

嵌套是可以解析,我在同一个scrapy project抓过这个网站的其他数据, 可能这个返回的response有问题.
举报 使用道具
8#
Fuller 管理员 发表于 2017-4-21 19:18:27 | 只看该作者
derykwang 发表于 2017-4-21 17:42
嵌套是可以解析,我在同一个scrapy project抓过这个网站的其他数据, 可能这个返回的response有问题. ...

把response回来的网页内容在控制台上打印出来,看看会有什么不同。

另外,可以换一下,驱动chrome或者firefox浏览器看看得到的网页有什么不同
举报 使用道具
9#
derykwang 初级会员 发表于 2017-4-21 19:23:39 | 只看该作者
Fuller 发表于 2017-4-21 19:18
把response回来的网页内容在控制台上打印出来,看看会有什么不同。

另外,可以换一下,驱动chrome或者fi ...

谢谢两位大神,搞定了.
举报 使用道具
您需要登录后才可以回帖 登录 | 立即注册

精彩推荐

  • Gephi社会网络分析-马蜂窝游记文本分词并同
  • Gephi社会网络分析-基于马蜂窝游记文本以词
  • 知乎话题文本根据词语间距筛选后生成共词矩
  • 马蜂窝游记文本分词后以词语间距为筛选条件
  • 学习使用apriori算法挖掘关联关系

热门用户

GMT+8, 2024-4-20 14:26