【发布时间】:2014-10-31 11:04:42
【问题描述】:
我正在使用 Scrapy 和 Regex 来解析一些非标准的 Web 源代码。然后我希望解析返回的字典的第一个元素:
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.selector import Selector
from scrapy.item import Item
from scrapy.spider import BaseSpider
from scrapy import log
from scrapy.cmdline import execute
from scrapy.utils.markup import remove_tags
import time
import re
import json
import requests
class ExampleSpider(CrawlSpider):
name = "goal2"
allowed_domains = ["whoscored.com"]
start_urls = ["http://www.whoscored.com"]
download_delay = 5
rules = [Rule(SgmlLinkExtractor(allow=('\Teams'),deny=(),), follow=False, callback='parse_item')]
def parse_item(self, response):
sel = Selector(response)
titles = sel.xpath("normalize-space(//title)")
print '-' * 170
myheader = titles.extract()[0]
print '********** Page Title:', myheader.encode('utf-8'), '**********'
print '-' * 170
match1 = re.search(re.escape("DataStore.prime('stage-player-stat', defaultTeamPlayerStatsConfigParams.defaultParams , ") \
+ '(\[.*\])' + re.escape(");"), response.body)
if match1 is not None:
playerdata1 = match1.group(1)
teamid = json.loads(playerdata1[0])
print teamid
“playerdata1”的第一个元素的键称为“TeamId”。我认为上述方法可行,但出现以下错误:
teamid = json.loads(playerdata1[0])
File "C:\Python27\lib\json\__init__.py", line 338, in loads
return _default_decoder.decode(s)
File "C:\Python27\lib\json\decoder.py", line 366, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "C:\Python27\lib\json\decoder.py", line 382, in raw_decode
obj, end = self.scan_once(s, idx)
exceptions.ValueError: Expecting object: line 1 column 1 (char 0)
谁能看到这里有什么问题?
【问题讨论】:
-
您是否希望
match1.group(1)成为 JSON 字符串?试试teamid = json.loads(playerdata1)[0]? -
如果您至少可以给我们一个示例 URL 进行测试,这将有所帮助,其中包含
DataStore.prime文本。 -
@MartijnPieters 是的,没问题...这里有一个链接...view-source:whoscored.com/Teams/32/… 在这个例子中我希望变量 'teamid' 的值等于 '32'此页面上团队的 ID。谢谢