佐塚間桐 发表于 2019-10-2 23:16

BRRM 发表于 2019-10-2 23:43

本帖最后由 BRRM 于 2019-10-2 23:57 编辑

<table class = 'content_box_item' border = 1 cellspacing=0 cellpadding=3 width = '720px'>
      <tr class = 'lmd'>
                <td class = 'bborder' align = 'left' colspan=10>
                        <table class='btext' width='100%'><tr>
                              <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>
                              <td valign='bottom'><b> 苍蝇翅膀 </b>   物品 ID# 601 (Wing_Of_Fly)</td></td>
                              <td valign='bottom' align='right'>
                              <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>
                              <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>
      </tr>
</table>
看出问题了吗,第4行的 <table> 在第6行被 </td></td> 提前结束了。所以第11行的</table>把第1行的 <table class = 'content_box_item' ...>给结束了

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

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


精钢魔像 发表于 2019-10-2 23:58

bs4 的解析器你换成lxml试试

startdl 发表于 2019-10-3 00:23

用js呗
这句就能获得你要的全部table,然后直接在控制台里复制出来粘贴到本地的html里
麻烦的是每个页面要重新复制粘贴一遍
let tables = document.getElementsByClassName('content_box_item')


佐塚間桐 发表于 2019-10-3 10:59

佐塚間桐 发表于 2019-10-3 11:00

佐塚間桐 发表于 2019-10-3 11:03

typeunknown 发表于 2019-10-3 11:11

自己写正则吧

startdl 发表于 2019-10-3 13:43

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

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

佐塚間桐 发表于 2019-10-3 17:03

cxf5102 发表于 2019-10-3 18:06

这网页table套table的把👴看麻了,我寻思你要是想保留原格式的话够你喝一壶
我寻思要么你(JS) document.querySelectorAll('table.content_box_item') ,取innerText,再正则处理
要么按照表结构写选择器,感觉工作量应该差不多

kinta 发表于 2019-10-3 18:09

试试pyquery

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

佐塚間桐 发表于 2019-10-3 21:32

cxf5102 发表于 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,后一个取得图片地址再下图片

win8 发表于 2019-10-3 22:05

搭车问个问题我有几十个log文件,都是text/csv格式,有没有同时打开同步滚动高亮差异内容的工具?

佐塚間桐 发表于 2019-10-3 22:31

佐塚間桐 发表于 2019-10-3 22:54

startdl 发表于 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

rrpw777 发表于 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_CN/latest/user/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
页: [1]
查看完整版本: 求问 怎么抓取页面上的多个表格数据啊?Try5