使用转义的ascii-strings

时间:2016-05-11 17:19:31

标签: python html parsing web web-crawler

我目前正在使用 Python 中的抓取工具,它已经在http://lyrics.wikia.com/抓取一个类型页面以获取所有乐队和专辑然后抓取这些链接以获取特定歌曲的链接,最终解析歌词并将其放入数据库中,以便它可以帮助我分析抒情内容。

我让我的抓取工具执行所有这些步骤,但是当我使用 urllib beautifulsoup 从lyric页面解析html时,我得到了奇怪的内容。我调查了这个,似乎有一个脚本阻止人们爬行?在查看html源代码时,歌词会像下面那样被加密。我不知道该怎么称呼这么可悲,我不能自己做进一步的研究而不知道该找什么。

<div class='lyricbox'>&#73;&#116;&#32;&#119;&#97;&#115;&#32;&#119;&#104;&#101;&#110;&#32;&#73;&#32;&#114;&#101;&#97;&#108;&#105;&#122;&#101;&#100;<br />&#116;&#104;&#97;&#116;&#32;&#108;&#105;&#102;&#101;&#32;&#104;&#97;&#115;&#32;&#110;&#111;&#32;&#109;&#101;&#97;&#110;&#105;&#110;&#103;<br />&#110;&#111;&#32;&#112;&#117;&#114;&#112;&#111;&#115;&#101;&#44;&#32;&#110;&#111;&#32;&#113;&#117;&#97;&#114;&#114;&#121;<br />&#46;&#46;&#46;&#110;&#111;&#32;&#97;&#110;&#115;&#119;&#101;&#114;&#101;&#115;&#46;&#46;&#46;<br /><br />&#65;&#110;&#100;&#32;&#97;&#108;&#108;&#32;&#116;&#104;&#101;&#32;&#100;&#114;&#101;&#97;&#114;&#121;&#32;&#110;&#105;&#103;&#104;&#116;<br />&#116;&#104;&#97;&#116;&#32;&#104;&#97;&#100;&#32;&#98;&#101;&#102;&#97;&#108;&#108;&#101;&#110;&#32;&#97;&#99;&#114;&#111;&#115;&#115;<br />&#116;&#104;&#101;&#32;&#108;&#97;&#110;&#100;<br />&#73;&#32;&#115;&#108;&#105;&#112;&#112;&#101;&#100;&#32;&#105;&#110;&#116;&#111;&#32;&#97;&#32;&#114;&#101;&#118;&#101;&#114;&#121;<br />&#97;&#32;&#119;&#101;&#98;&#32;&#111;&#102;&#32;&#104;&#117;&#109;&#97;&#110;&#32;&#104;&#97;&#110;&#100;<br /><br />&#89;&#111;&#117;&#32;&#108;&#111;&#110;&#103;&#101;&#100;&#32;&#116;&#111;&#32;&#115;&#111;&#97;&#114;&#32;&#117;&#112;&#32;&#104;&#105;&#103;&#104;<br />&#116;&#111;&#32;&#99;&#97;&#114;&#101;&#115;&#115;&#32;&#116;&#104;&#101;&#32;&#115;&#105;&#108;&#107;&#121;&#32;&#119;&#105;&#110;&#100;&#115;<br />&#116;&#111;&#32;&#101;&#109;&#98;&#114;&#97;&#99;&#101;&#32;&#97;&#110;&#100;&#32;&#107;&#105;&#115;&#115;&#32;&#97;&#115;&#32;&#108;&#111;&#118;&#101;&#114;&#115;<br />&#46;&#46;&#46;&#116;&#104;&#101;&#32;&#101;&#116;&#104;&#101;&#114;&#46;&#46;&#46;<br /><br 

使用Google Chrome开发人员工具进行调查时,歌词是可读的。

示例页面是:http://lyrics.wikia.com/wiki/Agalloch:The_Wilderness

故事很长: 这是什么?它从何而来?我如何找到解决方法? (请记住,我想用大约20000页来做到这一点,所以最好是快速和/或可迭代的

提前致谢!

4 个答案:

答案 0 :(得分:1)

您应该发布我们可以帮助调试的代码,而不是使用正确的编码方案我猜测。 Import requests适合我:

>>> import requests
>>> import bs4
>>> url = "http://lyrics.wikia.com/wiki/Agalloch:The_Wilderness"
>>> req = requests.get(url)
>>> soup = bs4.BeautifulSoup(req.text, "html.parser")
>>> lyrics = soup.find("div", {"class":"lyricbox"})
>>> lyrics.get_text().rstrip()

这将返回:

"It was when [... ] the cosmos...Forevermore..."

答案 1 :(得分:0)

这些是HTML编码字符:http://www.ascii.cl/htmlcodes.htm

你只需解码它们。可能有一个现有工具可用于解码它们。

答案 2 :(得分:0)

因此,事实证明这些是ascii字符的整数值。在你的脚本中,你可以做这样的事情来获得可打印的ascii!

>>> a = '&#73;&#116;&#32;&#119;&#97;&#115;&#32;&#119;&#104;&#101;&#110;&#32;&#73;&#32;&#114;&#101;&#97;&#108;&#105;&#122;&#101;&#100;'
>>> ''.join(map(chr,map(int,a.replace('&#','').split(';')[:-1])))                        
'It was when I realized'

希望这有帮助!

答案 3 :(得分:0)

这些是转发的HTML广告,例如&amp; &&amp;具有十进制和十六进制等效表示。你的文字充满了小数。这是你如何做到的。

import html
s = "<div class='lyricbox'>&#73;&#116;&#32;&#119;&#97;&#115;&#32;&#119;&#104;&#101;&#110;&#32;&#73;&#32;&#114;&#101;&#97;&#108;&#105;&#122;&#101;&#100;<br />&#116;&#104;&#97;&#116;&#32;&#108;&#105;&#102;&#101;&#32;&#104;&#97;&#115;&#32;&#110;&#111;&#32;&#109;&#101;&#97;&#110;&#105;&#110;&#103;<br />&#110;&#111;&#32;&#112;&#117;&#114;&#112;&#111;&#115;&#101;&#44;&#32;&#110;&#111;&#32;&#113;&#117;&#97;&#114;&#114;&#121;<br />&#46;&#46;&#46;&#110;&#111;&#32;&#97;&#110;&#115;&#119;&#101;&#114;&#101;&#115;&#46;&#46;&#46;<br /><br />&#65;&#110;&#100;&#32;&#97;&#108;&#108;&#32;&#116;&#104;&#101;&#32;&#100;&#114;&#101;&#97;&#114;&#121;&#32;&#110;&#105;&#103;&#104;&#116;<br />&#116;&#104;&#97;&#116;&#32;&#104;&#97;&#100;&#32;&#98;&#101;&#102;&#97;&#108;&#108;&#101;&#110;&#32;&#97;&#99;&#114;&#111;&#115;&#115;<br />&#116;&#104;&#101;&#32;&#108;&#97;&#110;&#100;<br />&#73;&#32;&#115;&#108;&#105;&#112;&#112;&#101;&#100;&#32;&#105;&#110;&#116;&#111;&#32;&#97;&#32;&#114;&#101;&#118;&#101;&#114;&#121;<br />&#97;&#32;&#119;&#101;&#98;&#32;&#111;&#102;&#32;&#104;&#117;&#109;&#97;&#110;&#32;&#104;&#97;&#110;&#100;<br /><br />&#89;&#111;&#117;&#32;&#108;&#111;&#110;&#103;&#101;&#100;&#32;&#116;&#111;&#32;&#115;&#111;&#97;&#114;&#32;&#117;&#112;&#32;&#104;&#105;&#103;&#104;<br />&#116;&#111;&#32;&#99;&#97;&#114;&#101;&#115;&#115;&#32;&#116;&#104;&#101;&#32;&#115;&#105;&#108;&#107;&#121;&#32;&#119;&#105;&#110;&#100;&#115;<br />&#116;&#111;&#32;&#101;&#109;&#98;&#114;&#97;&#99;&#101;&#32;&#97;&#110;&#100;&#32;&#107;&#105;&#115;&#115;&#32;&#97;&#115;&#32;&#108;&#111;&#118;&#101;&#114;&#115;<br />&#46;&#46;&#46;&#116;&#104;&#101;&#32;&#101;&#116;&#104;&#101;&#114;&#46;&#46;&#46;<br /><br>"
html.unescape(s)
"<div class='lyricbox'>It was when I realized<br />that life has no meaning<br />no purpose, no quarry<br />...no answeres...<br /><br />And all the dreary night<br />that had befallen across<br />the land<br />I slipped into a revery<br />a web of human hand<br /><br />You longed to soar up high<br />to caress the silky winds<br />to embrace and kiss as lovers<br />...the ether...<br /><br>"

一个好的解析器会处理这个问题,即使是极简主义的HTMLParser也可以解决这个问题。