夜阑卧听风吹雨

铁马冰河入梦来

Loading

一次 xpath、css选择器一直获取不到 text 的问题

前言

最近想爬取一个网站来练习 scrapy 的使用,结果在获取数据时遇到了问题。明明在浏览器可以使用 xpath 代码定位到指定区域,但是在 Python 里运行起来就是获取不到文本。我甚至一度以为我获取文本的方法不对。这里记录下我的解决过程。

  • 虽然可以使用 re 或者 BeautifulSoup 模块,但是我铁了心要使用已有的 xpath (css 选择器内部也是要被转成 xpath,于是就学/使用这个来提高那么一点点效率)来获取数据。

分析

这里要获取一个区域的数据,通过浏览器看到的路径写了对应的 xpath 代码,正确运行:
屏幕截图
写好 xpath 代码:response.xpath("string(//div[@class='co_content8']//span)")。在 scrapy 跑起来后却没有获取到数据(以后可以学一下 scrapy shell 来测试),将获取到的 response 写入文件发现:
屏幕截图

  • 这里用相对 //span 是因为本站其他网页有些是有嵌套其他标签的。

可以发现这里竟然是有个 <td> 标签的,在浏览器上再查看网页源代码发现:
屏幕截图
原来真的有一个多余的 td 标签,不太清楚内部获取文本的逻辑,反正这样成功导致获取不到数据了(可能是网站反爬虫的一个小手段)。

写代码测试

浏览器虽然解析了 td 为多余的标签,但是在 xpath 里它却没有与浏览器一致,以下为我通过 xpath 获取后 .extract() 的测试结果:

  • 使用 "string(//div[@class='co_content8']//span)",获取到的文本为空。
  • 使用 "string(//div[@class='co_content8']//span/td)",获取到的文本为空。
  • 使用 "string(//div[@class='co_content8']//td)",获取到:
['\xa0']
  • 使用 "string(//div[@class='co_content8']//td/*)",获取到:
['\r\n\r\n◎译\u3000\u3000名\u3000Leap◎片\u3000\u3000名\u3000夺冠/中国女排◎年\u3000\u3000代\u30002020◎产\u3000\u3000地\u3000中国大陆,中国香港◎类\u3000\u3000别\u3000剧情 / 运动◎语\u3000\u3000言\u3000汉语普通话,英语,日语,葡萄牙语◎字\u3000\u3000幕\u3000中文◎上映日期\u30002020-09-25(中国大陆)◎IMDb评分\xa0\xa06.7/10 from 538 users◎豆瓣评分\u30007.3/10 from 255515 users◎文件格式\u3000x264 + aac◎视频尺寸\u30001920 x 1016◎片\u3000\u3000长\u3000135分钟◎导\u3000\u3000演\u3000陈可辛 Peter Chan◎编\u3000\u3000剧\u3000张冀 Ji Zhang◎主\u3000\u3000演\u3000巩俐 Li Gong\u3000\u3000\u3000\u3000\xa0\xa0\u3000黄渤 Bo Huang\u3000\u3000\u3000\u3000\xa0\xa0\u3000吴刚 Gang Wu\u3000\u3000\u3000\u3000\xa0\xa0\u3000彭昱畅 Yuchang Peng\u3000\u3000\u3000\u3000\xa0\xa0\u3000白浪 Lydia Bai\u3000\u3000\u3000\u3000\xa0\xa0\u3000朱婷 Ting Zhu\u3000\u3000\u3000\u3000\xa0\xa0\u3000徐云丽 Yunli Xu\u3000\u3000\u3000\u3000\xa0\xa0\u3000张常宁 Changning Zhang\u3000\u3000\u3000\u3000\xa0\xa0\u3000姚迪 Di Yao\u3000\u3000\u3000\u3000\xa0\xa0\u3000林莉 Li Lin\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘晓彤 Xiaotong Liu\u3000\u3000\u3000\u3000\xa0\xa0\u3000颜妮 Ni Yan\u3000\u3000\u3000\u3000\xa0\xa0\u3000惠若琪 Ruoqi Hui\u3000\u3000\u3000\u3000\xa0\xa0\u3000丁霞 Xia Ding\u3000\u3000\u3000\u3000\xa0\xa0\u3000袁心玥 Xinyue Yuan\u3000\u3000\u3000\u3000\xa0\xa0\u3000龚翔宇 Xiangyu Gong\u3000\u3000\u3000\u3000\xa0\xa0\u3000李现 Xian Li\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘敏涛 Mintao Liu\u3000\u3000\u3000\u3000\xa0\xa0\u3000陈展 Zhan Chen\u3000\u3000\u3000\u3000\xa0\xa0\u3000罗慧 Hui Luo\u3000\u3000\u3000\u3000\xa0\xa0\u3000毛雯 Wen Mao\u3000\u3000\u3000\u3000\xa0\xa0\u3000李紫微 Ziwei Li\u3000\u3000\u3000\u3000\xa0\xa0\u3000李冬徐 Dongxu Li\u3000\u3000\u3000\u3000\xa0\xa0\u3000马雪纯 Xuechun Ma\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘畅 Chang Liu\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘贞宏 Zhenhong Liu\u3000\u3000\u3000\u3000\xa0\xa0\u3000凌敏 Min Ling\u3000\u3000\u3000\u3000\xa0\xa0\u3000李阳一 Yangyi Li\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘晨曦 Chenxi Liu\u3000\u3000\u3000\u3000\xa0\xa0\u3000邢佳栋 Jiadong Xing\u3000\u3000\u3000\u3000\xa0\xa0\u3000曾春蕾 Chunlei Zeng\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘晏含 Yanhan Liu\u3000\u3000\u3000\u3000\xa0\xa0\u3000王梦洁 Wang Mengjie\u3000\u3000\u3000\u3000\xa0\xa0\u3000郑益昕 Zheng Yixin\u3000\u3000\u3000\u3000\xa0\xa0\u3000杨涵玉 Hanyu Yang\u3000\u3000\u3000\u3000\xa0\xa0\u3000王媛媛 Yuanyuan Wang\u3000\u3000\u3000\u3000\xa0\xa0\u3000王路加 Lujia Wang\u3000\u3000\u3000\u3000\xa0\xa0\u3000李珊 Shan Li\u3000\u3000\u3000\u3000\xa0\xa0\u3000安家杰 Jiajie An\u3000\u3000\u3000\u3000\xa0\xa0\u3000玛丽安妮·斯泰因布莱彻 Marianne Steinbrecher\u3000\u3000\u3000\u3000\xa0\xa0\u3000杰奎琳·卡瓦霍 Jaqueline Carvalho\u3000\u3000\u3000\u3000\xa0\xa0\u3000帕乌拉·配奇诺 Paula Pequeno\u3000\u3000\u3000\u3000\xa0\xa0\u3000雅南 Fiona Fu\u3000\u3000\u3000\u3000\xa0\xa0\u3000许文姗 Audrey Hui\u3000\u3000\u3000\u3000\xa0\xa0\u3000宋世雄 Shixiong Song\u3000\u3000\u3000\u3000\xa0\xa0\u3000高野浩幸 Hiroyuki Takano\u3000\u3000\u3000\u3000\xa0\xa0\u3000霍尔·约翰逊 Halle Johnson\u3000\u3000\u3000\u3000\xa0\xa0\u3000孟子旋 Zixuan Meng\u3000\u3000\u3000\u3000\xa0\xa0\u3000李雅楠 Yanan Li\u3000\u3000\u3000\u3000\xa0\xa0\u3000小平花织 Kodaira Kaori\u3000\u3000\u3000\u3000\xa0\xa0\u3000中道瞳 Hitomi Nakamichi\u3000\u3000\u3000\u3000\xa0\xa0\u3000姜倩雯 Qianwen Jiang\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘抒妍 Shuyan Liu\u3000\u3000\u3000\u3000\xa0\xa0\u3000迈克·杰克逊 Mike Jackson\u3000\u3000\u3000\u3000\xa0\xa0\u3000张寒艳 Hanyan Zhang\u3000\u3000\u3000\u3000\xa0\xa0\u3000赵晨璐 Chenlu Zhao\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘桃 Tao Liu\u3000\u3000\u3000\u3000\xa0\xa0\u3000李孟婕 Mengjie Li\u3000\u3000\u3000\u3000\xa0\xa0\u3000田欣 Xin Tian\u3000\u3000\u3000\u3000\xa0\xa0\u3000谢星 Xing Xie\u3000\u3000\u3000\u3000\xa0\xa0\u3000王永强 Yongqiang Wang\u3000\u3000\u3000\u3000\xa0\xa0\u3000杜功海 Gonghai Du◎标\u3000\u3000签\u3000体育 | 郎平 | 巩俐 | 运动 | 中国 | 国产电影 | 陈可辛 | 2020◎简\u3000\u3000介\u3000\u30002008年8月15日,北京奥运会女排比赛,中国VS美国。戴着金丝框眼镜的郎平(巩俐 饰)坐在美国队教练席上,大气沉稳,目光如电;中国队教练(黄渤 饰)站在场边,全神贯注,面带笑容。中国队教练望向郎平,目光充满深意,不断经过的人影遮蔽了他的视线,中国女排三十余年的沉浮图景被缓缓打开……◎获奖情况\u3000\u3000第33届中国电影金鸡奖 (2020)\u3000\u3000最佳故事片\u3000\u3000最佳导演(提名) 陈可辛\u3000\u3000最佳编剧 张冀\u3000\u3000最佳男配角(提名) 吴刚\u3000\u3000最佳摄影 赵晓时\u3000\u3000最佳美术(提名) 孙立\u3000\u3000最佳剪辑(提名) 张一博\u3000\u3000最佳录音(提名) 黄铮\u3000\u3000\u3000\u3000第6届豆瓣电影年度榜单 (2019)\u3000\u3000最值得期待的华语电影(提名)【下载地址】 磁力链点击 夺冠.BD.1080p.国语中字.mkv \r\n\r\n\r\n\r\n\r\n\r\n\r\n      ']
  • 使用 "//div[@class='co_content8']//td/text()",获取到:
['\xa0', '\r\n', '◎译\u3000\u3000名\u3000Leap', '◎片\u3000\u3000名\u3000夺冠/中国女排', '◎年\u3000\u3000代\u30002020', '◎产\u3000\u3000地\u3000中国大陆,中国香港', '◎类\u3000\u3000别\u3000剧情 / 运动', '◎语\u3000\u3000言\u3000汉语普通话,英语,日语,葡萄牙语', '◎字\u3000\u3000幕\u3000中文', '◎上映日期\u30002020-09-25(中国大陆)', '◎IMDb评分\xa0\xa06.7/10 from 538 users', '◎豆瓣评分\u30007.3/10 from 255515 users', '◎文件格式\u3000x264 + aac', '◎视频尺寸\u30001920 x 1016', '◎片\u3000\u3000长\u3000135分钟', '◎导\u3000\u3000演\u3000陈可辛 Peter Chan', '◎编\u3000\u3000剧\u3000张冀 Ji Zhang', '◎主\u3000\u3000演\u3000巩俐 Li Gong', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000黄渤 Bo Huang', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000吴刚 Gang Wu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000彭昱畅 Yuchang Peng', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000白浪 Lydia Bai', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000朱婷 Ting Zhu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000徐云丽 Yunli Xu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000张常宁 Changning Zhang', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000姚迪 Di Yao', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000林莉 Li Lin', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘晓彤 Xiaotong Liu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000颜妮 Ni Yan', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000惠若琪 Ruoqi Hui', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000丁霞 Xia Ding', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000袁心玥 Xinyue Yuan', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000龚翔宇 Xiangyu Gong', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000李现 Xian Li', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘敏涛 Mintao Liu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000陈展 Zhan Chen', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000罗慧 Hui Luo', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000毛雯 Wen Mao', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000李紫微 Ziwei Li', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000李冬徐 Dongxu Li', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000马雪纯 Xuechun Ma', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘畅 Chang Liu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘贞宏 Zhenhong Liu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000凌敏 Min Ling', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000李阳一 Yangyi Li', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘晨曦 Chenxi Liu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000邢佳栋 Jiadong Xing', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000曾春蕾 Chunlei Zeng', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘晏含 Yanhan Liu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000王梦洁 Wang Mengjie', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000郑益昕 Zheng Yixin', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000杨涵玉 Hanyu Yang', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000王媛媛 Yuanyuan Wang', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000王路加 Lujia Wang', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000李珊 Shan Li', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000安家杰 Jiajie An', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000玛丽安妮·斯泰因布莱彻 Marianne Steinbrecher', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000杰奎琳·卡瓦霍 Jaqueline Carvalho', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000帕乌拉·配奇诺 Paula Pequeno', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000雅南 Fiona Fu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000许文姗 Audrey Hui', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000宋世雄 Shixiong Song', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000高野浩幸 Hiroyuki Takano', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000霍尔·约翰逊 Halle Johnson', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000孟子旋 Zixuan Meng', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000李雅楠 Yanan Li', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000小平花织 Kodaira Kaori', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000中道瞳 Hitomi Nakamichi', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000姜倩雯 Qianwen Jiang', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘抒妍 Shuyan Liu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000迈克·杰克逊 Mike Jackson', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000张寒艳 Hanyan Zhang', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000赵晨璐 Chenlu Zhao', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000刘桃 Tao Liu', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000李孟婕 Mengjie Li', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000田欣 Xin Tian', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000谢星 Xing Xie', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000王永强 Yongqiang Wang', '\u3000\u3000\u3000\u3000\xa0\xa0\u3000杜功海 Gonghai Du', '◎标\u3000\u3000签\u3000体育 | 郎平 | 巩俐 | 运动 | 中国 | 国产电影 | 陈可辛 | 2020', '◎简\u3000\u3000介', '\u3000\u30002008年8月15日,北京奥运会女排比赛,中国VS美国。戴着金丝框眼镜的郎平(巩俐 饰)坐在美国队教练席上,大气沉稳,目光如电;中国队教练(黄渤 饰)站在场边,全神贯注,面带笑容。中国队教练望向郎平,目光充满深意,不断经过的人影遮蔽了他的视线,中国女排三十余年的沉浮图景被缓缓打开……', '◎获奖情况', '\u3000\u3000第33届中国电影金鸡奖 (2020)', '\u3000\u3000最佳故事片', '\u3000\u3000最佳导演(提名) 陈可辛', '\u3000\u3000最佳编剧 张冀', '\u3000\u3000最佳男配角(提名) 吴刚', '\u3000\u3000最佳摄影 赵晓时', '\u3000\u3000最佳美术(提名) 孙立', '\u3000\u3000最佳剪辑(提名) 张一博', '\u3000\u3000最佳录音(提名) 黄铮', '\u3000\u3000', '\u3000\u3000第6届豆瓣电影年度榜单 (2019)', '\u3000\u3000最值得期待的华语电影(提名)', ' ', ' ', '\r\n\r\n\r\n\r\n\r\n']

这里可以顺带看出 text()string() 的区别。


最后,需要使用正则来匹配数据。而且因为需要使用到里面的某个标签的 href 属性,于是未使用 string(),仅使用 movie_content = response.xpath("//div[@class='co_content8']//td/*") 获取 td 标签下的 html。然后再使用 movie_content.re(r"◎片  名\s+(.*?)<br>")[0] 获取到电影名称。

夺冠/中国女排
  • 里面的特殊字符:\xa0&nbsp;\u3000 为全角空白符。
  • 注意到这里使用的是 [0] 而不是普通 re 模块的 [1]

其他

在 PyCharm 查看我们的 html 文件时,可以发现这里解析 html 的逻辑与 xpath 的是一致的!因此特殊情况使用这个路径获取数据,也是比浏览器更为准确的方式。
屏幕截图

posted @ 2021-02-07 10:01  二次蓝  阅读(1812)  评论(0编辑  收藏  举报