![]() | 1 demo06 2021-04-03 15:03:46 +08:00 via Android 就我所了解,你这个 tables 还是个 element 对象,你调用的 entree.tostring 方法只是获取了 tables 的对象索引值,如果需要获取 tables 下的子 element 的内容可以用 xpth('.//a[class="className"]/text()'),如果获取节点属性值可以用 xpath('.//a/@attrName/text()')来获取,注意获取子标签下的其他标签时不能有 /table 不然会出错具体什么原因我给忘了,昨天才看完,随后我翻翻,还有就是 /text()是获取当前标签下的直属文本内容,//text()是获取当前标签下所有的文本内容,这块刚看完,不知道我理解的对不对 |
![]() | 2 demo06 2021-04-03 15:10:08 +08:00 via Android 另外 xpth 最后获取的内容是个集合,如果只有一个值可以后缀[0]取集合第一个下标的值,如果你 xpath 写的不太准确的最后获取的值有多个的话,下标写几就是取第几个值 |
![]() | &nbs; 3 milukun 2021-04-03 15:40:37 +08:00 首先,这个 xpath 就是不对的 //*[@id="mw-content-text"]/table[@caption="返回数据说明"] 你可以在 F12 里面直接 crtl+F 查找里面直接输入 xpath 看看能不能查找得到,这里是支持 xpath 的 |
![]() | 4 milukun 2021-04-03 15:40:50 +08:00 |
![]() | 5 badacook OP @milukun 因为 有多个 caption="返回数据说明" d table,分别是 id="mw-content-text"元素的子元素,且互为不间断的兄弟元素,我有 F12 查看 其中一个元素 xpath 检索 //*[@id="mw-content-text"]/table[26]/caption,我只是在这个基础上改成查找 包含 caption 属性,且值为"返回数据说明" 的 table 元素 |
![]() | 7 misaka19000 2021-04-03 16:41:31 +08:00 |
![]() | 8 badacook OP @misaka19000 我感觉 我 xpath 没写错,我有参照 W3C xpath 语法来写,就是取到了 DOM 对象,如何还原表单,后续的处理,我看 pandas 的 read_html 其中带 attrs 参数,参数为字典格式,可获取特定属性的 table,我使用 attrs = {"caption":"返回数据说明"} 不带这个参数能获取所有 table,带了反而报错 |
![]() | 9 demo06 2021-04-03 17:49:11 +08:00 via Android |
![]() | 10 badacook OP 发现了自己的一个大错误,caption 作为 table 的标题,并不是 table 的属性,而是最近的子元素,那针对 caption 的 table 筛选,何种方法最便捷呢 |
11 vngghgfjnff 2021-04-03 21:36:10 +08:00 等答案 |
![]() | 12 demo06 2021-04-04 12:57:07 +08:00 via Android 你贴个 HTML 吧 |
![]() | 13 badacook OP @demo06 http://baostock.com/baostock/index.php/Python_API%E6%96%87%E6%A1%A3 比如这个页面 我想取出 所有的 caption 为返回数据说明的 table,结合 pandas 处理 DataFrame 的能力 我上面 实例 里面的 text = requests.post(url, headers=headers) 就是获取 HTML 页面的 text.text 你也可以直接 打开这个页面 http://baostock.com/baostock/index.php/Python_API%E6%96%87%E6%A1%A3 使用 F12 查看源码 |
![]() | 14 demo06 2021-04-05 13:04:15 +08:00 @badacook tables=tree.xpath('//table[@class="wikitable"]/caption[contains(text(),"返回数据说明")]/..') for table in tables: print(etree.tostring(table, method='html', with_tail=False)) |
![]() | 16 demo06 2021-04-05 13:08:21 +08:00 @badacook 总结一下,用 xpath 获取 caption 包含 返回数据说明的子标签然后用 /.. 再获取他的父标签(我看了一下页面里面所有 table 的 class 都是 wikitable,用这种方法获取比较准确),然后 toString 后,获得的就是标准 table 表格 |
![]() | 17 demo06 2021-04-05 16:11:12 +08:00 page = requests.post(url, headers=headers).text tree = etree.HTML(page) tables=tree.xpath('//table[@class="wikitable"]/caption[contains(text(),"返回数据说明")]/..') for table in tables: cOntent=etree.tostring(table) # result.decode('utf-8') with open('./table.html','ab+') as fp: fp.write(content) print(content) |
![]() | 18 badacook OP @demo06 非常感谢大神 xpath 语法真的很赞,这个语法我要好好研究一下,本来还觉得学了解 xpath,自惭形秽啊 |
![]() | 20 justseemore 2021-04-06 10:57:04 +08:00 |