我想从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>]
我如何使这项工作?
答案 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']")