找回密码
 立即注册
搜索
查看: 1563|回复: 26

[其他] 求问 怎么抓取页面上的多个表格数据啊?Try5

[复制链接]
头像被屏蔽
     
发表于 2019-10-2 23:16 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2019-10-2 23:43 | 显示全部楼层
本帖最后由 BRRM 于 2019-10-2 23:57 编辑
  1. <table class = 'content_box_item' border = 1 cellspacing=0 cellpadding=3 width = '720px'>
  2.         <tr class = 'lmd'>
  3.                 <td class = 'bborder' align = 'left' colspan=10>
  4.                         <table class='btext' width='100%'><tr>
  5.                                 <td width=24><img src = 'http://file5.ratemyserver.net/items/small/601.gif' border = '0' onMouseOver = "ddrivetip_image('<img src = \'http://file5.ratemyserver.net/items/large/601.gif\' border = \'1\'>')" onMouseOut = "hideddrivetip_image()"></td>
  6.                                 <td valign='bottom'><b> 苍蝇翅膀 </b>   物品 ID# 601 (Wing_Of_Fly)</td></td>
  7.                                 <td valign='bottom' align='right'>
  8.                                 <a href='index.php?page=re_item_db&item_id=601&ird=0' title='查看这物品复兴后的资料' onclick='return popItem_re("601&ird=0",1,1)'><img src='images/see_renewal.gif' border=0></a>
  9.                                 <a href='item_sprname_search.php?item_id=601'><img src='images/spr.gif' border=0 title='look up sprite name' onclick="return popWin('item_sprname_search.php?item_id=601&small=1', 'name', spr_dim)"></a>
  10.         </tr>
  11. </table>
复制代码

看出问题了吗,第4行的 <table> 在第6行被 </td></td> 提前结束了。所以第11行的</table>把第1行的 <table class = 'content_box_item' ...>给结束了

也就是说
  1. soup.find_all('table', attrs={"class": "content_box_item"})[0]
复制代码
其实只解析了上面那部分内容。

简单的说,这个页面写得很不规范,只有聪明的浏览器才能解决这种不规范问题,这种库解决不了。


回复

使用道具 举报

     
发表于 2019-10-2 23:58 | 显示全部楼层
bs4 的解析器你换成lxml试试
回复

使用道具 举报

     
发表于 2019-10-3 00:23 | 显示全部楼层
用js呗
这句就能获得你要的全部table,然后直接在控制台里复制出来粘贴到本地的html里
麻烦的是每个页面要重新复制粘贴一遍
  1. let tables = document.getElementsByClassName('content_box_item')
复制代码



回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-3 10:59 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-3 11:00 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-3 11:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2019-10-3 11:11 来自手机 | 显示全部楼层
自己写正则吧
回复

使用道具 举报

     
发表于 2019-10-3 13:43 | 显示全部楼层
佐塚間桐 发表于 2019-10-3 11:03
试方法多半比手动慢。但是我贴的这一类是7页,其他的有几十页的,还有一百多页的,不想机械运动 ...

用js的话你的需求实现起来很简单,不过想一键操作会有跨域问题。在浏览器控制台写不会跨域但是麻烦的一笔。
不会写爬虫,帮不到你了
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-3 17:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2019-10-3 18:06 | 显示全部楼层
这网页table套table的把👴看麻了,我寻思你要是想保留原格式的话够你喝一壶
我寻思要么你(JS) document.querySelectorAll('table.content_box_item') ,取innerText,再正则处理
要么按照表结构写选择器,感觉工作量应该差不多
回复

使用道具 举报

     
发表于 2019-10-3 18:09 来自手机 | 显示全部楼层
试试pyquery

—— 来自 samsung SM-G9600, Android 9上的 S1Next-鹅版 v2.1.2
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-3 21:32 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2019-10-3 22:02 | 显示全部楼层
佐塚間桐 发表于 2019-10-3 21:32
请问选择器的思路是什么呢?

我现在想到的是干脆不管什么table不table了,直接用每个关键字定位,读取后 ...

我看这样
document.querySelectorAll('table.content_box_item > tbody > tr') 这样选出来的nodelist,每个元素就是表的一行,你要分列就再写细点
document.querySelectorAll('table.content_box_item tr.lmd td > img') 选择所有图标,你要的应该是大图,在元素属性里有
你用这两个选择器做应该就可以了,前一个取innerText,后一个取得图片地址再下图片
回复

使用道具 举报

     
发表于 2019-10-3 22:05 来自手机 | 显示全部楼层
搭车问个问题  我有几十个log文件,都是text/csv格式,有没有同时打开同步滚动高亮差异内容的工具?
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-3 22:31 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-3 22:54 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2019-10-4 00:16 | 显示全部楼层
win8 发表于 2019-10-3 22:05
搭车问个问题  我有几十个log文件,都是text/csv格式,有没有同时打开同步滚动高亮差异内容的工具? ...

百度一下Diffchecker 有各种查差异内容的网站
不过只能对比2个文件 多个文件的没看过,毕竟很少有这种需求
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-4 12:56 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-4 13:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2019-10-4 17:16 | 显示全部楼层
用js操纵无头chrome的库Puppeteer。我的笨办法:根据content_box_item这个选择器找到表格,存数组里。如果页面上有下一页这个按钮就点一下,再找表格存好。没有下一页就退出程序。合并表格数组之后加上头尾生成完整html写入文件。应该有更好的思路。查了一下python下有一个第三方的port叫pyppeteer,楼主有兴趣可以试试。
就只把7页content_box_item取出来了。
链接: https://pan.baidu.com/s/1yBjOelMcjRPKrX98W35iSQ 提取码: st8e
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-4 18:45 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-5 01:22 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2019-10-5 02:39 | 显示全部楼层
佐塚間桐 发表于 2019-10-5 01:22
现在已经能正常读取名字,但还有问题。在python里面输出显示的是乱码: ²ÔÓ¬³á°ò

查了一下,原始 ...

http://cn.python-requests.org/zh ... quickstart.html#id3
指定下编码

或者取字节流自己转字符串
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-5 11:02 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

头像被屏蔽
     
 楼主| 发表于 2019-10-5 18:42 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2019-10-6 23:15 来自手机 | 显示全部楼层
我明天用公司的产品试试

—— 来自 Google Pixel 2 XL, Android 10上的 S1Next-鹅版 v2.1.2
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-9-27 17:24 , Processed in 0.250893 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表