如何刮取一个原本包含“ \ x2d”但在我的项目中将该字符另存为“-”的页面?

时间:2019-03-29 20:04:54

标签: regex python-2.7 unicode scrapy unicode-string

我需要从页面上的脚本中抓取一些文本,并将该文本保存在抓取项中(大概是UTF-8字符串)。但是,我从中实际刮取的文字文本中写有一些特殊字符,我认为是UTF十六进制。例如“-”写为“ \ x2f”。如何在我的抓取项目中抓取以“ \ x2f”表示的字符,但将其另存为“-”?

抓取页面上的内容摘录:

<script type="text/javascript">

[approx 100 various lines of script, omitted]

"author": "Kurt\x20Vonnegut",
"internetPrice": "799",
"inventoryType": "new",
"title": "Slaughterhouse\x2DFive",
"publishedYear": "1999",

[approx 50 additional various lines of script, removed]

</script>

我的拼写脚本如下:

pattern_title = r'"title": "(.+)"'
title_raw = response.xpath('//script[@type="text/javascript"]').re(pattern_title)
item['title'] = title_raw[0]

对于此项目,scrapy的输出将返回:

'作者':u'Kurt \ x20Vonnegut','title':u'Slaughterhouse \ x2DFive'

理想情况下,我想要:

“作者”:“ Kurt Vonnegut”,“标题”:“五号屠宰场”

我尝试不更改输出的内容:

  • 将最后一行更改为:item ['title'] = title_raw [0] .decode('utf-8')
  • 将最后一行更改为:item ['title'] = title_raw [0] .encode('latin1')。decode('utf-8')

最后,在需要明确说明的情况下,我无法控制此信息在我要抓取的网站上的显示方式。

2 个答案:

答案 0 :(得分:1)

Converting \x escaped string to UTF-8的启发,我通过使用.decode('string-escape')来解决此问题,如下所示:

pattern_title = r'"title": "(.+)"'
title_raw = response.xpath('//script[@type="text/javascript"]').re(pattern_title)
title_raw[0] = title_raw[0].decode('string-escape')
item['title'] = title_raw[0]

答案 1 :(得分:0)

您可以使用urllib's unquote功能。

在Python 3.x上:

from urllib.parse importe unquote
unquote("Kurt\x20Vonnegut")

Python 2.7上:

from urllib import unquote
unquote("Kurt\x20Vonnegut")

看看Item LoadersInput Processors,以便可以对所有已抓取的字段执行此操作。