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

版权声明:本文为博主原创文章,转载请注明出处: https://blog.csdn.net/SL_World/article/details/84893957

笔者以爬取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)

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

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

②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.首先查看是否成功获取了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'

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

补充:

①建议使用requests.content

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

xml = response.content

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)

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

61

猜你喜欢

转载自blog.csdn.net/SL_World/article/details/84893957