我想我搞乱了我的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
答案 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)
这是丑陋而脆弱的(如果脚本的格式会破坏它 改变了),但它适用于当前的输入。