关于python使用xpath爬取网页内容返回值为空列表的解决方法
在使用XPath爬取网站中遇到的 写完代码发现运行后返回值为 [] 空列表解决方法:1、首先看看你的这段代码中是否有 "tbody"存在 ,把"tbody"去掉为什么呢? 因为在用xpath解析网页的时候,会遇到tbody标签。tbody标签有的时候可以解析,有的时候不可以解析,遇到tbody标签时要看网页源代码,如果源代码有tbody标签,就要加上tbody标签才能解析。如果源代码没有tbody
·
在使用XPath爬取网站中遇到的 写完代码发现运行后返回值为 [] 空列表
解决方法:
1、首先看看你的这段代码中是否有 "tbody"存在 ,把"tbody"去掉
text=dom.xpath('/html/body/div[2]/div[3]/div[3]/table/tbody/tr[1]/td[1]/a/text()')
为什么呢? 因为在用xpath解析网页的时候,会遇到tbody标签。tbody标签有的时候可以解析,有的时候不可以解析,遇到tbody标签时要看网页源代码,如果源代码有tbody标签,就要加上tbody标签才能解析。
如果源代码没有tbody标签,那么tbody标签是浏览器对html文本进行一定的规范化而强行加上去的,这时如果xpath中有tbody则无法解析出来,此时去掉xpath中的tbody即可。
2、然后是headers的问题 ,返回值为 [] 时,请把 headers = {'...'} 和headers=headers 去掉
或者使用这个,亲测没问题。
headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;'}
3、最后是绝对路径和相对路径的问题
# 以猪八戒网为例:
import requests
from lxml import etree
import time
url = "https://guangdong.zbj.com/search/service?kw=SaaS&r=1"
headers = {'User-Agent': 'User-Agent:Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;'}
html = requests.get(url=url, headers=headers).text
if len(html) > 100: # 是否解析出text
print('解析成功')
else:
print('解析失败', len(html))
# 利用正则修改源代码里的注释符,起不到注释的作用
html_new = html.replace(r'<!--', '"').replace(r'-->', '"') # 看情况
# 解析
tree = etree.HTML(html_new)
# 拿到每一个服务商的div
# divs = tree.xpath('//*[@class="yxk-table"]/table/tbody/tr') # 测试
divs = tree.xpath('//*[@class="search-result-list-service"]/div') # 问题解决 如果这里返回值为 [] ,尝试使用相对路劲 已解决
# print(divs)
for div in divs:
company_money = div.xpath('./div[2]/div[1]/span/text()')[0].strip("¥") # 问题所在 已解决
company = div.xpath('./div[2]/a[2]/div[2]/div[1]/div[1]/text()')[0]
company_name = "saas".join(div.xpath('./div[2]/a[1]/text()'))
company_place = div.xpath('./div[2]/a[2]/div[2]/div[1]/div[2]/text()')[0]
finlly = [company, company_name, company_money, company_place]
time.sleep(1) # 防止频繁访问被封ip
print("over!!", finlly)
print("all over!!!!")
# 绝对路径
"/html/body/div[2]/div/div/div[3]/div/div[3]/div[4]/div[1]/div[1]/div[2]/div[1]/span"
# 相对路径
'//*[@id="__layout"]/div/div[3]/div/div[3]/div[4]/div[1]/div[1]/div[2]/div[1]/span'
CSDN 上关于这一块的内容太碎了 , 根据自己遇到的问题结合了一下 这里应该是最全的 祝你早日解决问题啦~
更多推荐
已为社区贡献1条内容
所有评论(0)