我需要一个带网站的表格中的值
我的Python代码
import sys
import getopt
import linecache
import string
import ftplib
import os
import requests
from lxml import html
import datetime
page = requests.get(URL)
tree = html.fromstring(page.content)
all_id = tree.xpath('//td[@style="display:none> >"]/text()')
print 'Wszystkie ID:', all_id
网站代码
<td style="display:none">id>277918954,id32>c14f940e3eed6a3871e1e3376048303f,level>0,key_left>0,key_right>0,name>file.png,type>File png,size>139.27 KB,hash>538dd38791b76170ab71feec9ef6fed5</td>
我只查看错误,哪里有问题?
答案 0 :(得分:0)
//td[@style="display:none> >"]/text()
这与呈现的元素不匹配,这将:
//td[@style="display:none"]/text()
虽然,这个表达似乎不可靠。
为了向您提供可靠的定位器,我们需要查看页面的完整HTML,但是,鉴于我们拥有的内容,如何检查文本以 id
开头:
//td[starts-with(., "id")]/text()
答案 1 :(得分:0)
作为替代方法,您可以使用BeautifulSoup
使用<td>
提取所有display:none
元素。有了这个,我会浏览所有HTML实体(将>
转换为>
),在逗号上拆分文本,对于列表中的每个条目,进一步根据{{1分割每个条目给你键/值对来构造一个>
字典:
params
这会显示from bs4 import BeautifulSoup
import HTMLParser
h = HTMLParser.HTMLParser()
html = requests.get(URL)
soup = BeautifulSoup(html)
for td in soup.find_all('td', style=re.compile('display\s*:\s*none')):
params = {}
for p in h.unescape(td.text).split(','):
k, v = p.split('>')
params[k] = v
print 'Id {}'.format(params['id'])
print 'Id32 {}'.format(params['id32'])
和id
,如下所示:
id32
Id 277918954
Id32 c14f940e3eed6a3871e1e3376048303f
将包含所有值:
params
这些可以显示如下:
{u'hash': u'538dd38791b76170ab71feec9ef6fed5', u'name': u'file.png', u'level': u'0', u'type': u'File png', u'key_right': u'0', u'key_left': u'0', u'id32': u'c14f940e3eed6a3871e1e3376048303f', u'id': u'277918954', u'size': u'139.27 KB'}
,并提供:
for k, v in params.iteritems():
print '{} : {}'.format(k, v)
如果您已有hash : 538dd38791b76170ab71feec9ef6fed5
name : file.png
level : 0
type : File png
key_right : 0
key_left : 0
id32 : c14f940e3eed6a3871e1e3376048303f
id : 277918954
size : 139.27 KB
个条目的列表,则<td>
可以显示如下:
id32
给你:
entries = [
'id>277918954,id32>c14f940e3eed6a3871e1e3376048303f,level>0,key_left>0,key_right>0,name>file.png,type>File png,size>139.27 KB,hash>538dd38791b76170ab71feec9ef6fed5',
'id>277918891,id32>4029b601c64a573be83f1114ffee88ac,level>0,key_left>0,key_right>0,name>nn.py,type>File py,size>2.87 KB,hash>bc8e6fcd432053547ae9227daf1fc8bc',
'id>277918001,id32>6bcd9fe60959a8798af2fea0db163792,level>0,key_left>0,key_right>0,name>new_100mb.test,type>File test,size>100 MB,hash>9b5183f05b62ca114c467945467050be',
'id>277917368,id32>183ad6a4932d1a11016f63fc563b610d,level>0,key_left>0,key_right>0,name>new_100mb.test,type>File test,size>100 MB,hash>9b5183f05b62ca114c467945467050be',
'id>277917219,id32>606e98d6d7a8ee286556e05752f71723,level>0,key_left>0,key_right>0,name>new_100mb.test,type>File test,size>100 MB,hash>9b5183f05b62ca114c467945467050be',
'id>277916938,id32>2086038f425efaeeab7e91904c0a24bc,level>0,key_left>0,key_right>0,name>new_100mb.test,type>File test,size>100 MB,hash>9b5183f05b62ca114c467945467050be',
'id>277915939,id32>5dc0b114317bb9b1250a20275cb5f7a5,level>0,key_left>0,key_right>0,name>100mb.test,type>File test,size>100 MB,hash>9b5183f05b62ca114c467945467050be']
for entry in entries:
params = {}
for p in entry.split(','):
k, v = p.split('>')
params[k] = v
print 'Id32 {}'.format(params['id32'])
答案 2 :(得分:0)
我使用了这段代码:
tree = html.fromstring(result.content)
bucket_elems = tree.findall(".//td[@style='display:none']")
bucket_names = [bucket_elem.text_content().replace("\n", "").strip() for bucket_elem in bucket_elems]
print bucket_names
结果: http://pastebin.com/Cuv1KsnR
如何只使用ID?