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 写的不太准确的最后获取的值有多个的话,下标写几就是取第几个值
|
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
zpfhbyx 2021-04-06 10:57:04 +08:00
|