这是我要从中获取数据的表

<table class="statBlock" cellspacing="0">
<tr>
    <th>
        <a href="/srd/magicOverview/spellDescriptions.htm#level">Level</a>:
    </th>
    <td>
        <a href="/srd/spellLists/clericSpells.htm#thirdLevelClericSpells">Clr 3</a>
    </td>
</tr>
<tr>
    <th>
        <a href="/srd/magicOverview/spellDescriptions.htm#components">Components</a>:
    </th>
    <td>
        V, S
    </td>
</tr>
<tr>
    <th>
        <a href="/srd/magicOverview/spellDescriptions.htm#castingTime">Casting Time</a>:
    </th>
    <td>
        1 <a href="/srd/combat/actionsInCombat.htm#standardActions">standard action</a>
    </td>
</tr>

ETC...




这是我到目前为止用于解析的草率代码

        for sel in response.xpath('//tr'):
        string = " ".join(response.xpath('//th/a/text()').extract()) + ":" + " ".join(response.xpath('//td/text()').extract())
        print string


但这会产生如下结果:

Level Components Casting Time Range Effect Duration Saving Throw Spell Resistance:V, S, M, XP 12 hours 0 ft. One duplicate creature Instantaneous None No


当输出看起来像

Level: CLR 1  Components:V, S, M etc...


本质上,由于某种原因,它并没有遍历表的每一行并为每一行查找一个和一个单元格并将它们粘在一起,而是从中查找所有数据和来自中的所有数据,然后将这两组粘在一起。我认为我的for语句需要修复-如何使其分别检查每一行?

最佳答案

当您查询xpath时-

response.xpath('//th/a/text()')


这将返回其中包含<th>元素(具有<a>)的所有text()元素。那不是你想要的。你应该做 -

for sel in response.xpath('//tr'):
    string = " ".join(sel.xpath('.//th/a/text()').extract()) + ":" + " ".join(sel.xpath('.//td/text()').extract())
    print string


循环内xpath中的点使得xpath相对于当前节点而不是相对于起始节点运行。

Working with Relative XPaths上有关xpath的更多详细信息

关于python - 循环遍历所有行,而不是分别遍历每一行,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31773343/

10-16 11:54