【问题标题】:python read text from table scrapingpython从表格抓取中读取文本
【发布时间】:2016-05-02 00:58:09
【问题描述】:

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

我的 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>

我只是查看错误,问题出在哪里?

【问题讨论】:

  • 能否请您也粘贴导入?我的意思是我想requests 是同名的python 包,但我不确定其余的。
  • 好的没问题,更新后

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


【解决方案1】:

作为一种替代方法,您可以使用BeautifulSoup 提取所有带有display:none 的&lt;td&gt; 元素。有了这个,我取消了所有 HTML 实体(将 &amp;gt; 转换为 &gt;),用逗号分割文本,并为列表中的每个条目进一步分割基于 &gt; 的每个条目给你键/value 对来构造 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

如果您已有&lt;td&gt; 条目的列表,则id32s 可以显示如下:

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'])

给你:

Id32 c14f940e3eed6a3871e1e3376048303f
Id32 4029b601c64a573be83f1114ffee88ac
Id32 6bcd9fe60959a8798af2fea0db163792
Id32 183ad6a4932d1a11016f63fc563b610d
Id32 606e98d6d7a8ee286556e05752f71723
Id32 2086038f425efaeeab7e91904c0a24bc
Id32 5dc0b114317bb9b1250a20275cb5f7a5

【讨论】:

  • Martin,当我需要查看源代码中的所有 ID 时怎么办?如果我有 ID 如何打印 id32?
【解决方案2】:

我用过这个代码:

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

如何只取身份证?

【讨论】:

    【解决方案3】:

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

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

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

    不过,这个说法似乎不太靠谱。

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

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

    【讨论】:

    • @Grz3siu 你确定你真的在page.content中有这个元素吗?
    • 对不起,
    • @Grz3siu 不确定您最后的评论是什么意思。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签