python从表格中读取文本

时间:2016-01-25 16:21:53

标签: python web-scraping html-table beautifulsoup screen-scraping

我需要一个带网站的表格中的值

我的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&gt;277918954,id32&gt;c14f940e3eed6a3871e1e3376048303f,level&gt;0,key_left&gt;0,key_right&gt;0,name&gt;file.png,type&gt;File png,size&gt;139.27 KB,hash&gt;538dd38791b76170ab71feec9ef6fed5</td>

我只查看错误,哪里有问题?

3 个答案:

答案 0 :(得分:0)

  

//td[@style="display:none> &gt;"]/text()

这与呈现的元素不匹配,这将:

//td[@style="display:none"]/text()

虽然,这个表达似乎不可靠。

为了向您提供可靠的定位器,我们需要查看页面的完整HTML,但是,鉴于我们拥有的内容,如何检查文本 id开头:

//td[starts-with(., "id")]/text()

答案 1 :(得分:0)

作为替代方法,您可以使用BeautifulSoup使用<td>提取所有display:none元素。有了这个,我会浏览所有HTML实体(将&gt;转换为>),在逗号上拆分文本,对于列表中的每个条目,进一步根据{{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?