问题在python中解析具有lxml和xpath的站点

时间:2015-04-27 20:21:21

标签: python xpath lxml

我想我搞乱了我的xpath。我想要做的是获取此页面中每一行的信息。

这是我到目前为止所得到的,但它没有输出我正在寻找的东西。

import requests
from lxml import etree

r = requests.get('http://mtgoclanteam.com/Cards?edition=DTK')
doc = etree.HTML(r.text)
#get list of cards
cards = [card for card in doc.xpath('id("cardtable")/x:tbody/x:tr[1]/x:td[3]')]
for card in cards:
    print card

1 个答案:

答案 0 :(得分:0)

这里的主要问题是从服务器提供的实际文档包含一个空表:

<table id="cardtable" class="cardlist"/>

数据在页面加载后由空表元素后面的嵌入式javascript填充:

<script>
    $('#cardtable').dataTable({
        "aLengthMenu": [[25, 100, -1], [25, 100, "All"]],


        "bDeferRender": true,
        "aaSorting": [],


        "bPaginate": false,
        "aaData": [
          ...DATA IS HERE...
        ],
        "aoColumns": [
            { "sTitle": "Card name", "sWidth": "260" },

                    { "sTitle": "Rarity", "sWidth": "40" },

            { "sTitle": "Buy", "sWidth": "80" },
            { "sTitle": "Sell", "sWidth": "80" },
            { "sTitle": "Bots with stock" }]

    })
</script>

数据本身包含字典的aaData元素 传递给dataTable()方法。在Python中提取它 会变得棘手(这不仅仅是一个JSON文档)。可能是一个 适用于脚本文本的正则表达式可以帮到你 你想要什么(或者只是遍历脚本的行并在aaData键之后取一个)。

例如:

import pprint
import json
import requests
from lxml import etree

r = requests.get('http://mtgoclanteam.com/Cards?edition=DTK')
doc = etree.HTML(r.text)

script = doc.xpath('id("templatemo_content")/script')[0].text
found = False
result = None
for line in script.splitlines():
    if found:
        if '[' in line:
            result=line
            break
    if 'aaData' in line:
        found = True

if result:
    result =json.loads('[' + result + ']')
    pprint.pprint(result)

这是丑陋而脆弱的(如果脚本的格式会破坏它 改变了),但它适用于当前的输入。