Charles_God 2021-11-19 14:39 采纳率: 75%
浏览 157
已结题

Python爬虫只解析了一部分网页?

本想写个爬虫,把电影天堂搜索到的“名侦探柯南”的剧场版爬下来
结果遇到了这样的问题:

import requests
from lxml import etree

url = 'http://s.ygdy8.com/plus/s01.php?keyword=%C3%FB%D5%EC%CC%BD%BF%C2%C4%CF&searchtype=titlekeyword&channeltype=0&orderby=&kwtype=0&pagesize=10&typeid=1&TotalResult=24&PageNo={}'
url = url.format(1)

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.53',
           'Referer':'http://s.ygdy8.com/plus/s01.php?typeid=1&keyword=%BF%C2%C4%CF'}
page_text = requests.get(url,headers=headers).content
html = etree.HTML(page_text)

发现html.xpath('//div[@class="co_content8"]/ul')
有一个元素,这是正常的:[<Element ul at 0x1f76b179900>]
但是html.xpath('//div[@class="co_content8"]/ul/table')
就没有了:[]
利用html.xpath('//text()')查看爬取的内容
只截至到了第一个电影的标题:

['\r\n', '\r\n', '\r\n', '电影天堂-迅雷电影下载 - 名侦探柯南 - 搜索结果', '\r\n', '\r\n ', 'kstatus(); function kstatus(){self.status="喜欢本站使用 Ctrl+D 进行添加收藏,记得分享给您的朋友哦,TA会感谢您,谢谢支持!"; setTimeout("kstatus()",0);} function a() {   alert("亲,请使用 Ctrl+D 进行添加收藏!");}', '\r\n', '\r\n\t\t\t\t', '\r\n                      ', '\r\n\t\t\t\t\t', '\r\n\t\t\t\t\t\r\n\t\t\t', '\r\n\t\t\r\n\t\t', '\r\n\t\t\t\t\t', '\r\n', '最新影片', '\r\n', '经典影片', '\r\n', '国内电影', '\r\n', '欧美电影', '\r\n', '日韩电影', '\r\n', '华语电视', '\r\n', '日韩电视', '\r\n', '欧美电视', '\r\n', '最新综艺', '\r\n', '旧版综艺', '\r\n', '动漫资源', '\r\n', '游戏下载', '\r\n', '高分经典', '\r\n', '收藏本站', '\r\n\t\t', '\r\n\t\t \r\n ', '\r\n\r\n\r\n', '\r\n', '\r\n', '\r\n \r\n', '\r\n \r\n', '\r\n \r\n', '\r\n', '\r\n', '\r\n \r\n\r\n', '\r\n', '当前位置:下载页面  返回', '电影下载首页', '\xa0 \xa0 \xa0 \xa0\xa0\xa0', ' ', '第二下载地址点击进入', '\xa0\xa0\xa0\xa0\xa0', ' ', '手机访问请下载本站app,点击进入!', '\xa0\xa0  \xa0 ', '  ', '\r\n', '\r\n\r\n', '\r\n', '\r\n', '\r\n\r\n\r\n', '\r\n', '\r\n', '手机访问请扫码下载本站app', '\r\n', '\r\n', '\r\n', ' ', '\r\n', '\r\n', '\r\n', '\r\n\r\n', '\r\n', '赞助位置', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n\r\n', '\r\n', '\r\n \r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '搜索:', '\r\n', '\r\n', '\r\n', '电影', '\r\n', '电视剧', '\r\n', '综艺', '\r\n', '旧综艺', '\r\n', '游戏', '\r\n', '动漫', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', ' ', '\xa0\xa0', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '\r\n', '电影天堂-迅雷电影下载 >> 搜索 “名侦探柯南” 结果:', '\r\n\r\n', '\r\n', '\r\n', ' \r\n', '\r\n\t', '\r\n', ' \r\n', '\r\n', '2018年悬疑《', '名侦探柯南', ':零的执行人》BD国日双语中字', '\r\n \r\n', '\r\n', ' \r\n', ' \u3000\u3000[', '名侦探柯南', ':零的执行人][BD-mkv.720p.国日双语中字][2018年悬疑] ◎译 名 ', '名侦探柯南', ':零的执行人/', '名侦探柯南', ':零之执行人/', '名侦探柯南', '2018/', '名侦探柯南', '剧场版2018 ◎片 名 名探']

我尝试:

with open('what.txt','wb') as f:
    f.write(page_text)

结果中出现了除《零的执行人》外的其他电影:

<div class="co_content8">
<ul>
<tr> 
<td height="346" valign="top">
    <table border='0' width='100%'>
<tr height='24'> 
<td width='6%' align="center"><img src="/img/file.gif" width="18" height="17"></td>
<td width='55%'><b><a href='/html/gndy/dyzz/20181110/57771.html'>2018年悬疑《<font color='red'>名侦探柯南</font>:零的执行人》BD国日双语中字</a></b></td>
 
</tr>
<tr> 
<td height="56" colspan='3'>   [<font color='red'>名侦探柯南</font>:零的执行人][BD-mkv.720p.国日双语中字][2018年悬疑] ◎译 名 <font color='red'>名侦探柯南</font>:零的执行人/<font color='red'>名侦探柯南</font>:零之执行人/<font color='red'>名侦探柯南</font>2018/<font color='red'>名侦探柯南</font>剧场版2018 ◎片 名 名探偵コナン ゼロの執行人 / Detective Conan: Zero the Enforcer / Meitantei Conan: Zero n<font color='#8F8C89'>(2018-11-10)</font> 
</td>
</tr>
<tr> 
<td height='2' colspan='4' background='/img/writerbg.gif'></td>
</tr>
</table><table border='0' width='100%'>
<tr height='24'> 
<td width='6%' align="center"><img src="/img/file.gif" width="18" height="17"></td>
<td width='55%'><b><a href='/html/gndy/dyzz/20191005/59203.html'>2019年悬疑动画《<font color='red'>名侦探柯南</font>:绀青之拳》BD国日双语中字</a></b></td>
 
</tr>
<tr> 
<td height="56" colspan='3'>   <font color='red'>名侦探柯南</font>:绀青之拳 1080p BD国日双语中字 2019年悬疑动画 ◎译 名 <font color='red'>名侦探柯南</font>:绀青之拳 / Detective Conan: The Fist of Blue Sapphire / <font color='red'>名侦探柯南</font>2019 / <font color='red'>名侦探柯南</font>:深蓝之拳 ◎片 名 名探偵コナン 紺青の拳 ◎年 代 2019 ◎产 地 日本 ◎类 别 动画/悬疑 ◎语<font color='#8F8C89'>(2019-10-05)</font> 
</td>
</tr>
<tr> 
<td height='2' colspan='4' background='/img/writerbg.gif'></td>
</tr>
</table><table border='0' width='100%'>
<tr height='24'> 
<td width='6%' align="center"><img src="/img/file.gif" width="18" height="17"></td>

好像我的xpath语法也没错,为什么会出现这样的情况呢

另外电影天堂page_text = requests.get(url,headers=headers).content.decode()
用utf-8和gbk解码都有不能识别的内容,咋办啊

  • 写回答

1条回答 默认 最新

  • Syb呀呀 2021-11-19 15:49
    关注

    第一个问题,你用html.xpath('//div[@class="co_content8"]/ul/table')找不到,是因为在table那一类,有很多分支标签,所以定位不到具体的元素。
    第二个问题跟上一个同理,你用//text()取标题,可能直接复制网页的xpath?
    综上,链接和标题提取,都可以直接以table为起始,xpath语法为 //table/tbody/tr/td/b/a/@href (链接) //table/tbody/tr/td/b/a/text() (标题)
    第三个编码问题,这个网站源码已经写了charset=gb2312,所以编码是gb2312
    部分代码:

    
    import requests
    from lxml import etree
    headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.53'}
    
    url='http://s.ygdy8.com/plus/s01.php?keyword=%C3%FB%D5%EC%CC%BD%BF%C2%C4%CF&searchtype=titlekeyword&channeltype=0&orderby=&kwtype=0&pagesize=10&typeid=1&TotalResult=24&PageNo=1'
    
    res=requests.get(url,headers=headers,timeout=5)
    
    res.encoding='gb2312'
    dom=etree.HTML(res.text)
    
    xp_href=dom.xpath("//table/tbody/tr/td/b/a/@href")
    xp_title=dom.xpath('//table/tbody/tr/td/b/a/text()')
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月29日
  • 已采纳回答 11月21日
  • 创建了问题 11月19日

悬赏问题

  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图
  • ¥15 关于#DMA固件#的问题,请各位专家解答!