Python使用xpath爬取数据返回空列表解决方案

本文以爬取2018年AAAI人工智能顶会论文元数据为例,介绍爬取过程中遇到的问题。包括xpath读取失败,原因是浏览器对html文本规范化;URL问题,原URL获取信息不全,新URL含字段可获取完整信息。还给出使用二进制响应内容、加入请求头的建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

                    版权声明:本文为博主原创文章,转载请注明出处:                        https://blog.youkuaiyun.com/SL_World/article/details/84893957                    </div>
                                                <link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/ck_htmledit_views-cd6c485e8b.css">
                                    <div id="content_views" class="markdown_views prism-atom-one-dark">
                <!-- flowchart 箭头图标 勿删 -->
                <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                    <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                </svg>
                                        <blockquote>

笔者以爬取2018年AAAI人工智能顶会论文元数据为例。其中包括标题(title)和摘要(abstract)等字段

前言:

首先需要查看该网页是否可以爬取,通过在URL后加入/robots,txt可以查看。

tbody问题

URL:2018AAAI的第一篇论文元数据页面 页面如下:
2323

笔者通过谷歌浏览器选取上图红框内容的xpath如下:

from lxml import etree
import requests
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/rt/metadata/16583/0/'
response = requests.get(url)
html = response.content
data = etree.HTML(html).xpath('//*[@id="content"]/table/tbody/tr[4]/td[4]/text()')
print(data)

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

返回结果是一个空列表
2323434
经查询得知原因是:浏览器会对html文本进行一定的规范化,所以会自动在路径中加入tbody,导致读取失败,在此处直接在路径中去除tbody即可。
正确xpath:

data = etree.HTML(html).xpath('//*[@id="content"]/table/tr[4]/td[4]/text()')

 
  • 1

②URL问题

URL:2018AAAI的第一篇论文页面
675
笔者通过谷歌浏览器选取上图红框内容的xpath如下:

from lxml import etree
import requests
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16065'
response = requests.get(url)
xml = response.content
data = etree.HTML(xml).xpath('//*[@id="abstract"]/div/text()')

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

返回结果是一个空列表
1.首先查看是否成功获取了XML
可见成功获取了xml,说明请求服务器成功获得响应。但仔细查看获取的xml发现里面没有相关的摘要和作者相关信息。肯定也就无法通过xpath获取摘要文本。逐步查看xml发现里面有一条URL和请求的URL很相似,点进去发现两个URL是同一个页面。
在这里插入图片描述
发现第二个URL路径中多了一个Paper字段。

'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/view/16065'
'https://aaai.org/ocs/index.php/AAAI/AAAI18/paper/viewPaper/16065'

 
  • 1
  • 2

尝试请求第二个URL后发现返回了完整的包含网页摘要、作者标题等信息的XML,遂成功爬取到该网页的摘要。
62

补充:

①建议使用requests.content

建议获取请求得到的响应用requests.content返回二进制响应内容,使用requests.text可能会出现编码声明不支持问题

xml = response.content

 
  • 1

11

②建议加入请求头(headers)

以模拟浏览器登录

from lxml import etree
import requests
headers = {
    'Cookie':'OCSSID=4df0bjva6j7ejussu8al3eqo03',
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
                 ' (KHTML, like Gecko) Chrome/68.0.3440.106 Safari/537.36',
}
url = 'https://aaai.org/ocs/index.php/AAAI/AAAI18/rt/metadata/16583/0/'
response = requests.get(url,headers=headers)
html = response.content
data = etree.HTML(html).xpath('//*[@id="content"]/table/tbody/tr[4]/td[4]/text()')
print(data)

 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

获取请求头,使用谷歌浏览器可获取,一般选取User-AgentCookie等字段,使用浏览器登录某个网页时,需要向服务器端发出请求,请求头就包含自己使用的浏览器的相关信息。相关介绍见:百度百科

61

                                </div>
            <link href="https://csdnimg.cn/release/phoenix/mdeditor/markdown_views-e44c3c0e64.css" rel="stylesheet">
                </div>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值