【问题标题】:HTML Parsing and erronous \xa0HTML解析和错误\xa0
【发布时间】:2016-09-04 13:44:51
【问题描述】:

我是编码领域的初学者,并尝试进行一些 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

希望有人可以帮助初学者在编码世界中迈出更多的步伐。 在此先感谢:)

【问题讨论】:

    标签: python-2.7 beautifulsoup html-parsing


    【解决方案1】:

    数据没有“丢失”。

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

    您必须使用类似Selenium 的东西,最好将phantomjs 用作无头浏览器!

    您也可以使用Splash,但它并不常见,对 selenium 用户的支持更多。

    【讨论】:

    • 谢谢你的作品!我现在可以看到汤中的数据了。我仍然需要弄清楚如何单击不同的按钮以尝试获取所有不同的数据,但这是一个好的开始。再次感谢您的快速回复!
    • @Dennis 如果我有任何帮助,请接受答案:)
    • @Dennis,如果你使用 selenium,你根本不需要 bs4,你可以使用 xpaths 和选择来解析源。
    • @PadraicCunningham 他不需要,但拥有它很好,很多人选择拥有它,因为它更易于导航节点
    • 我接受了@RafaelAlmeida 的答案。我忘记了,所以谢谢你的提醒。我想我会先尝试用 bs4 来解决它,因为我有一些经验,但也在 selenium 中只是为了获得一些经验。感谢 PadraicCunningham 的想法
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-21
    • 2018-06-11
    • 1970-01-01
    • 2021-12-08
    • 2015-09-08
    相关资源
    最近更新 更多