zyj1214 发表于 2023-11-6 22:33:50

关于xpath解析定位问题?


# (1) 请求对象的定制
# (2)获取网页的源码
# (3)下载


# 需求 下载的前十页的图片
# https://sc.chinaz.com/tupian/qinglvtupian.html   
# https://sc.chinaz.com/tupian/qinglvtupian_page.html

import urllib.request
from lxml import etree

def create_request(page):
    if(page == 1):
      url = 'https://sc.chinaz.com/tupian/qinglvtupian.html'
    else:
      url = 'https://sc.chinaz.com/tupian/qinglvtupian_' + str(page) + '.html'
    print(url)
    headers = {
      'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
    }

    request = urllib.request.Request(url = url, headers = headers)
    return request

def get_content(request):
    response = urllib.request.urlopen(request)
    content = response.read().decode('utf-8')
    return content


def down_load(content):
#   下载图片
    # urllib.request.urlretrieve('图片地址','文件的名字')
    tree = etree.HTML(content)

    name_list = tree.xpath('//div[@class="item masonry-brick"]/img/@alt') #在网页检查中的div中找不到 id,新手不知道怎么写路径,,
                                                                                                          #但是这个路径用网页xpath插件可以查看到内容,,
    print(len(name_list))            #这里打印结果为 0
    for name in name_list:
      print(name)                  #这里打印结果也为 0,,不知道哪里出了问题,在网页检查中的div中找不到 id,

    # 一般设计图片的网站都会进行懒加载
    # src_list = tree.xpath('//div[@class="item masonry-brick"]/img/@src')
    # print(src_list,len(src_list))
    # for i in range(len(name_list)):
    #   name = name_list
    #   src = src_list
    #   url = 'https:' + src
    #
    #   urllib.request.urlretrieve(url=url,filename='./loveImg/' + name + '.jpg')




if __name__ == '__main__':
    start_page = int(input('请输入起始页码'))
    end_page = int(input('请输入结束页码'))

    for page in range(start_page,end_page+1):
      # (1) 请求对象的定制
      request = create_request(page)
      # # (2)获取网页的源码
      content = get_content(request)
      # (3)下载
      down_load(content)

isdkz 发表于 2023-11-6 22:34:06

问题描述:
在给定的代码中,使用XPath解析网页内容,定位图片的名称。但是在执行代码后,发现无法获取到正确的图片名称,打印结果为0。

解决方案:
根据代码中的XPath表达式,定位图片名称的路径为'//div[@class="item masonry-brick"]/img/@alt'。但是根据问题描述,该路径在网页检查中找不到id,但可以在网页XPath插件中查看到内容。

问题的原因可能是网页内容动态加载或者XPath表达式不正确。为了解决这个问题,可以尝试以下几个步骤:

1. 确保网页内容已经完全加载:有些网页使用懒加载技术,即在初始加载时只显示部分内容,当用户滚动到底部时再加载剩余内容。在这种情况下,需要模拟用户滚动到底部的操作,以确保所有图片都已加载。

2. 调整XPath表达式:如果图片名称的路径不正确,可以尝试不同的XPath表达式来定位图片名称。可以使用浏览器的开发者工具来检查网页结构,找到正确的XPath路径。

3. 检查网页内容:在获取网页源码后,可以打印出网页内容,检查是否存在图片名称的相关信息。如果没有找到相关信息,可能是因为网页结构发生了变化或者内容被动态加载。

希望以上解决方案能够帮助到您解决问题。如果还有其他疑问,请随时提问。

Mike_python小 发表于 2023-11-6 22:35:04

根据你提供的代码,我看到你想要下载网页中的图片。在你提到的问题中,你遇到了XPath定位问题,无法正确获取图片的名称。下面我将解释可能出现问题的地方,并提供一种解决方法。

问题可能出现在以下两行代码:

name_list = tree.xpath('//div[@class="item masonry-brick"]/img/@alt')
print(len(name_list))


首先,请确保你使用的XPath表达式能够准确定位到图片的名称。你可以使用浏览器中的XPath插件来验证XPath表达式是否正确。检查网页源码,确定图片名称所在的HTML标签和属性。如果图片名称存在于img标签的alt属性中,那么你的XPath表达式是正确的。

如果你的XPath表达式是正确的,但仍然无法获取到正确的结果,请考虑以下几个可能的原因:

1. 网页内容未完全加载:有些网站会使用懒加载技术延迟加载图片和其他内容。这可能导致XPath无法正确找到预期的元素。你可以尝试等待一段时间,确保网页内容完全加载后再进行解析。

2. 网页结构变化:如果网页的结构发生变化,例如修改了CSS类名或HTML标签,你之前编写的XPath表达式可能就无法正确匹配到目标元素。请确保你的XPath表达式与网页的实际结构匹配。

3. 防爬虫机制:有些网站会采取防爬虫措施,例如使用动态生成的元素或验证码来阻止自动化程序获取内容。这可能导致XPath无法正确解析网页。你可以尝试模拟浏览器行为,例如使用Selenium库来加载网页并执行JavaScript代码,以绕过这些防护机制。

针对你的代码,我注意到你还注释了一部分关于图片地址的代码。如果你解决了图片名称获取的问题,你可以取消注释相关代码,使用正确的XPath表达式来获取图片地址,并使用urllib.request.urlretrieve()函数下载图片。

希望这些解释对你有所帮助!如果你有更多问题,请随时提问。

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 关于xpath解析定位问题?