爬虫xpath是正确的但为什么获取得到一个空列表

Java川 重庆邮电大学 水泥工  2019-02-27 11:37:32
以下图片是我写的测试:不知道为什么下面一个xapth取不到内容返回的是一个空的列表
但是xpath是正确的啊,


这是全代码,希望大佬指正
 import requests
import csv
from bs4 import BeautifulSoup
from lxml import etree


url='http://www.cqjlpggzyzhjy.gov.cn/cqjl/jyxx/003001/003001002/MoreInfo.aspx?CategoryNum=003001002'
header={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

def main():

for i in range(1,71):
#post请求修改表单数据 只需要写要修改的部分,不需要把表单里的全部内容都写进去
playload={'__EVENTARGUMENT':i}
r = requests.post(url, headers=header, data=playload,timeout=30)
r.encoding='utf-8' #或者 r.content.decode('utf-8') html=etree.HTML(r)
html=etree.HTML(r.text)
#xpath提取tbody内的所有的tr标签,尾部没有text()
trs=html.xpath('//*[@id="MoreInfoList1_DataGrid1"]//tr')

titles=[]
messages=[]
headers=['名称','时间']
keylists=[]
valuelists=[]
#获取公告名称 和日期 ,有text()表示提取标签内的文字,而且xpath返回的就是列表
for tr in trs:
#取所有的标题名字的第一个
name=tr.xpath('.//td[2]//a//text()')[0]
#取所有日期中第一个
time=((tr.xpath('./td[3]//text()')[0]).replace('\n','')).replace('\r','')
#拼接url,并取所有url中的第一个
urls="http://www.cqjlpggzyzhjy.gov.cn" + tr.xpath(".//td[2]//a/@href/text()")[0]
r2=requests.get(urls,headers=header)
r2.encoding='utf-8'
html2=etree.HTML(r2.text)

data={'中标公告':name,
'时间':time
}
with open('九龙坡公告标题','w',encoding='utf-8',newline='') as fp:
writer=csv.DictWriter(fp,headers)
writer.writeheader()
writer.writerows(titles)

#表中的每个元素

keylist=html2.xpath("//body//table[@class]/tbody/tr/td[1]//p//text()")
for i in range(6):
keylists.append(keylist[i])

#表中每个元素对应的值
valuelist=html2.xpath("//body//table[@class]/tbody/tr/td[2]//p//text()")
for i in range(6):
valuelists.append(valuelist[i])

for i in range(6):

key=keylists[i]
value=valuelists[i]
messages[0][key]=value[0]

with open('任务2九龙坡公告内容','w',encoding='utf-8',newline='') as f:
writer=csv.DictWriter(f,headers)
writer.writeheader()
writer.writerows(messages)

main()



...全文
14216 点赞 收藏 10
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
看,未来 2020-12-05
引用 4 楼 Chir Chang 的回复:
我知道xpath不要再浏览器上直接复制,尤其xpath中出现tbody的你需要删除,浏览器会规范这个html文档,因此xpath中会出现莫名其妙的一些路径,标签,这跟程序获得的html资源不一样。

难怪代码里面tbody被打了警告
回复
咖瑞芝 2020-10-13
把tbody删了
回复 2
蒋光道 2020-08-21
我也有这样的问题,和你的情况一样
回复
Java川 2020-08-21
引用 7 楼 jgdabc的回复:
我也有这样的问题,和你的情况一样
我知道xpath不要再浏览器上直接复制,尤其xpath中出现tbody的你需要删除,浏览器会规范这个html文档,因此xpath中会出现莫名其妙的一些路径,标签,这跟程序获得的html资源不一样。
回复
weixin_45636030 2019-10-31
我今天遇到差不多的问题,根据一个博主的提示,把“tbody”删除就运行成功了! 附上原博主网址 https://blog.csdn.net/qq_35425070/article/details/87697898
回复
Java川 2019-03-13
引用 3 楼 qq_44305513 的回复:
[quote=引用 楼主 chuan er的回复:]以下图片是我写的测试:不知道为什么下面一个xapth取不到内容返回的是一个空的列表
但是xpath是正确的啊,


这是全代码,希望大佬指正
 import requests
import csv
from bs4 import BeautifulSoup
from lxml import etree


url='http://www.cqjlpggzyzhjy.gov.cn/cqjl/jyxx/003001/003001002/MoreInfo.aspx?CategoryNum=003001002'
header={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

def main():

for i in range(1,71):
#post请求修改表单数据 只需要写要修改的部分,不需要把表单里的全部内容都写进去
playload={'__EVENTARGUMENT':i}
r = requests.post(url, headers=header, data=playload,timeout=30)
r.encoding='utf-8' #或者 r.content.decode('utf-8') html=etree.HTML(r)
html=etree.HTML(r.text)
#xpath提取tbody内的所有的tr标签,尾部没有text()
trs=html.xpath('//*[@id="MoreInfoList1_DataGrid1"]//tr')

titles=[]
messages=[]
headers=['名称','时间']
keylists=[]
valuelists=[]
#获取公告名称 和日期 ,有text()表示提取标签内的文字,而且xpath返回的就是列表
for tr in trs:
#取所有的标题名字的第一个
name=tr.xpath('.//td[2]//a//text()')[0]
#取所有日期中第一个
time=((tr.xpath('./td[3]//text()')[0]).replace('\n','')).replace('\r','')
#拼接url,并取所有url中的第一个
urls="http://www.cqjlpggzyzhjy.gov.cn" + tr.xpath(".//td[2]//a/@href/text()")[0]
r2=requests.get(urls,headers=header)
r2.encoding='utf-8'
html2=etree.HTML(r2.text)

data={'中标公告':name,
'时间':time
}
with open('九龙坡公告标题','w',encoding='utf-8',newline='') as fp:
writer=csv.DictWriter(fp,headers)
writer.writeheader()
writer.writerows(titles)

#表中的每个元素

keylist=html2.xpath("//body//table[@class]/tbody/tr/td[1]//p//text()")
for i in range(6):
keylists.append(keylist[i])

#表中每个元素对应的值
valuelist=html2.xpath("//body//table[@class]/tbody/tr/td[2]//p//text()")
for i in range(6):
valuelists.append(valuelist[i])

for i in range(6):

key=keylists[i]
value=valuelists[i]
messages[0][key]=value[0]

with open('任务2九龙坡公告内容','w',encoding='utf-8',newline='') as f:
writer=csv.DictWriter(f,headers)
writer.writeheader()
writer.writerows(messages)

main()


博主你的问题解决了吗?遇到了跟博主相同的问题[/quote]不要直接复制xpath 自己写
回复
Java川 2019-03-12
我知道xpath不要再浏览器上直接复制,尤其xpath中出现tbody的你需要删除,浏览器会规范这个html文档,因此xpath中会出现莫名其妙的一些路径,标签,这跟程序获得的html资源不一样。
回复
qq_44305513 2019-03-12
引用 楼主 chuan er的回复:
以下图片是我写的测试:不知道为什么下面一个xapth取不到内容返回的是一个空的列表
但是xpath是正确的啊,


这是全代码,希望大佬指正
 import requests
import csv
from bs4 import BeautifulSoup
from lxml import etree


url='http://www.cqjlpggzyzhjy.gov.cn/cqjl/jyxx/003001/003001002/MoreInfo.aspx?CategoryNum=003001002'
header={
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.110 Safari/537.36'}

def main():

for i in range(1,71):
#post请求修改表单数据 只需要写要修改的部分,不需要把表单里的全部内容都写进去
playload={'__EVENTARGUMENT':i}
r = requests.post(url, headers=header, data=playload,timeout=30)
r.encoding='utf-8' #或者 r.content.decode('utf-8') html=etree.HTML(r)
html=etree.HTML(r.text)
#xpath提取tbody内的所有的tr标签,尾部没有text()
trs=html.xpath('//*[@id="MoreInfoList1_DataGrid1"]//tr')

titles=[]
messages=[]
headers=['名称','时间']
keylists=[]
valuelists=[]
#获取公告名称 和日期 ,有text()表示提取标签内的文字,而且xpath返回的就是列表
for tr in trs:
#取所有的标题名字的第一个
name=tr.xpath('.//td[2]//a//text()')[0]
#取所有日期中第一个
time=((tr.xpath('./td[3]//text()')[0]).replace('\n','')).replace('\r','')
#拼接url,并取所有url中的第一个
urls="http://www.cqjlpggzyzhjy.gov.cn" + tr.xpath(".//td[2]//a/@href/text()")[0]
r2=requests.get(urls,headers=header)
r2.encoding='utf-8'
html2=etree.HTML(r2.text)

data={'中标公告':name,
'时间':time
}
with open('九龙坡公告标题','w',encoding='utf-8',newline='') as fp:
writer=csv.DictWriter(fp,headers)
writer.writeheader()
writer.writerows(titles)

#表中的每个元素

keylist=html2.xpath("//body//table[@class]/tbody/tr/td[1]//p//text()")
for i in range(6):
keylists.append(keylist[i])

#表中每个元素对应的值
valuelist=html2.xpath("//body//table[@class]/tbody/tr/td[2]//p//text()")
for i in range(6):
valuelists.append(valuelist[i])

for i in range(6):

key=keylists[i]
value=valuelists[i]
messages[0][key]=value[0]

with open('任务2九龙坡公告内容','w',encoding='utf-8',newline='') as f:
writer=csv.DictWriter(f,headers)
writer.writeheader()
writer.writerows(messages)

main()


博主你的问题解决了吗?遇到了跟博主相同的问题
回复
Java川 2019-02-28
经过etree处理过的网页结构标签会变么?xpath跟原来浏览器上匹配的xpath不一样了
回复
Java川 2019-02-27
愁了好久了 纯粹自学没人指点啊
回复
发帖
其他
创建于2009-10-09

222

社区成员

其他产品/厂家
申请成为版主
帖子事件
创建了帖子
2019-02-27 11:37
社区公告
暂无公告