[Python]从Steam获取XPath值并打印出来

时间:2014-08-03 10:31:44

标签: python xpath lxml python-requests

我想从Steamstoresite获取XPATH值,例如http://store.steampowered.com/app/234160/。在右侧是2个盒子。第一个包含Title,Genre,Developer ......我只需要这里的类型。每场比赛都有不同的数量。有些有4种类型,有些只有一种。然后还有另一个块,其中游戏特征是倾听(如单人游戏,多人游戏,合作游戏,游戏手柄......)

我需要所有这些价值观。 有时候(PEGI / USK)之间有一个图像 http://store.steampowered.com/app/233290

import requests
from lxml import html

page = requests.get('http://store.steampowered.com/app/234160/')
tree = html.fromstring(page.text)

blockone = tree.xpath(".//*[@id='main_content']/div[4]/div[3]/div[2]/div/div[1]")
blocktwo = tree.xpath(".//*[@id='main_content']/div[4]/div[3]/div[2]/div/div[2]")

print "Detailblock:" , blockone
print "Featureblock:" , blocktwo

这是我到目前为止的代码。当我尝试它时,它只是打印:

Detailblock: [<Element div at 0x2ce5868>]
Featureblock: [<Element div at 0x2ce58b8>]

我如何使这项工作?

1 个答案:

答案 0 :(得分:0)

xpath返回匹配元素的列表。您只是打印出该列表。

如果您想要第一个元素,则需要blockone[0]。如果你想要所有的元素,你必须循环它们(例如,理解)。

同时,你想为每个元素打印什么?直接的内在文本?整个子树的HTML根植于该元素?别的什么?无论你想要什么,你需要在Element类型上使用适当的方法来获得它; lxml无法读懂你的想法并弄清楚你想要什么,我们也不能。

听起来你真正想要的只是树中更深层次的元素。你可以xpath在那里。 (而不是像你一样逐一浏览所有元素并依赖索引,我只是写出了最简单的方法来达到我认为你要求的东西。)

genres = [a.text for a in blockone[0].xpath('.//a')]

或者,真的,为什么甚至首先得到blockone?为什么不首先将xpath直接添加到您想要的元素中?

gtags = tree.xpath(".//*[@id='main_content']/div[4]/div[3]/div[2]/div/div[1]//a")
genres = [a.text for a in gtags]

此外,如果您使用标记中的信息而不是通过显式遍历结构来查找信息,那么您可以使这更简单 - 并且更加健壮 -

gtags = tree.xpath(".//div[@class='glance_tags popular_tags']//a")

或者,因为在任何地方似乎都不是任何其他app_tag项目,只需:

gtags = tree.xpath(".//a[@class='app_tag']")