HTML解析和错误的\ xa0

时间:2016-05-09 19:32:04

标签: python-2.7 beautifulsoup html-parsing

我是编码领域的初学者,并尝试做一些HTML抓取。我已经在一些早期的项目中取得了成功,但我目前的项目无效。

问题与此网站有关: http://console.worldoftanks.com/encyclopedia/vehicles/usa/T1_Cunningham/ 我想从这个网站(和类似网站)中提取数据。

然而,当我尝试提取等级,价格等数据时,我遇到了一个问题。我的代码如下:

from bs4 import BeautifulSoup as BS
import lxml
import urllib2
from pprint import pprint
##

site="http://console.worldoftanks.com/encyclopedia/vehicles/usa/T1_Cunningham/"     
page=urllib2.urlopen(site)
soup= BS(page.read(),"lxml")

tank_tier = soup.findAll('span', {'data-class':"tank.tier"})
tier= tank_tier[0].contents
print "Tier is:", tier

main_stats= soup.findAll('div', {'class':"main-stats_item"})
print "\n\n Main stats:"
pprint(main_stats)

此代码的问题在于数据以某种方式丢失。该代码的结果如下:

Tier is: [u'\xa0']

 Main stats:
[<div class="main-stats_item">\n<span class="main-stats_title">\n<span class="main-stats_ico">\n<span class="svg-icon svg-icon__config js-svg-icon" data-src="//wxpcdn.gcdn.co/static/87ceef6/portal/img/svg-icons/flags/usa.svg"></span>\n</span>\n<span data-class="tank.nation">\xa0</span>\n</span>\n<span class="main-stats_note">Nation</span>\n</div>,
 <div class="main-stats_item">\n<span class="main-stats_title">\n<span class="main-stats_ico">\n<span class="svg-icon svg-icon__config js-svg-icon" data-src="//wxpcdn.gcdn.co/static/87ceef6/portal/img/svg-icons/vehicle-types/lighttank.svg"></span>\n</span>\n<span data-class="tank.type">\xa0</span>\n</span>\n<span class="main-stats_note">Type</span>\n</div>,
 <div class="main-stats_item">\n<span class="main-stats_title">\n<span class="main-stats_ico">\n<span class="svg-icon svg-icon__config js-svg-icon" data-src="//wxpcdn.gcdn.co/static/87ceef6/portal/img/svg-icons/configuration/tier.svg"></span>\n</span>\n<span data-class="tank.tier">\xa0</span>\n</span>\n<span class="main-stats_note">Tier</span>\n</div>,
 <div class="main-stats_item">\n<span class="main-stats_title">\n<span class="main-stats_ico">\n<span class="svg-icon svg-icon__config js-svg-icon" data-src="//wxpcdn.gcdn.co/static/87ceef6/portal/img/svg-icons/currency/gold.svg"></span>\n</span>\n<span data-class="tank.price">\xa0</span>\n</span>\n<span class="main-stats_note">Cost</span>\n<span class="main-stats_price">(Silver)</span>\n</div>,
 <div class="main-stats_item">\n<span class="main-stats_title">\n<span class="main-stats_ico">\n<span class="svg-icon svg-icon__config js-svg-icon" data-src="//wxpcdn.gcdn.co/static/87ceef6/portal/img/svg-icons/configuration/weight.svg"></span>\n</span>\n<span data-class="tank.weight">\xa0</span> / <span data-class="tank.loadLimit">\xa0</span>t\n                    </span>\n<span class="main-stats_note">Weight / Load limit</span>\n</div>,
 <div class="main-stats_item">\n<span class="main-stats_title">\n<span class="main-stats_ico">\n<span class="svg-icon svg-icon__config js-svg-icon" data-src="//wxpcdn.gcdn.co/static/87ceef6/portal/img/svg-icons/configuration/hit-points.svg"></span>\n</span>\n<span data-class="tank.hitPoints">\xa0</span>\n</span>\n<span class="main-stats_note">Hit Points</span>\n</div>]

首先,当我尝试找到一些特定值(如Tier)时,它会将数据转换为\ xa0,这是一个不间断的空格字符。如果我查找其他数据(另一个,结果的较长部分),可以看到main-stats_item下的所有数据都变为\ xa0而不是实际值。

我尝试了使用encode('utf-8')到使用lxml库创建tree.xpath的多种方法。使用树也会产生\ xa0字符。

有谁知道为什么用这些不间断的空格字符替换数据?可能如何解决?请注意,我不是要删除\ xa0,我正在尝试获取应该在该位置的数据。

我正在使用Python 2.7

希望有人可以帮助初学者在编码领域采取更多措施。 在此先感谢:)

1 个答案:

答案 0 :(得分:2)

数据不会“丢失”。

问题是代码是使用javascript动态创建的,因此您需要类似浏览器的体验来模拟javascript操作。

您必须使用类似Selenium的内容,最好使用phantomjs作为无头浏览器!

你也可以使用Splash,但这并不常见,对硒用户有更多的支持。