python xpath问题总结

xpath 处理网页出现的问题总结

<div class="name">
    <div class="title">
        <div class="price">
            <span>
                <a href="">网页欣赏</a>
            </span>
        </div>
    </div>
</div>
  1. 当文档为多层结构时,无法匹配内容
    1. 使用text()方法匹配不到内容,得到的只是空的     ‘\n     ’
      data.xpath('//div[@class="name"]//text()')
    2. 使用xpath(‘string(.)’)的方式,则可以正确匹配    
      data.xpath('//div[@class="name"]')[0].xpath('string(.)')

       

  2. 使用xpath得到的div对象,再次使用xpath匹配内容时,出现错误
    1. 使用 div对象  <class 'lxml.etree._Element'>,再次使用xpath 匹配其内容时,失败
    2.     html = etree.parse('./test_xpath.html', etree.HTMLParser())
          strings = etree.HTML(etree.tounicode(html))
      
          # print(strings)
          pp = strings.xpath('//div[@class="name"]')[0]
          print(type(strings))  # <class 'lxml.etree._Element'>
          print(type(pp))  # <class 'lxml.etree._Element'>
          print(pp.xpath('/div[@class="title"]')) # []

      - 为何会匹配失败??

      -  print(pp.xpath('/div[@class="title"]')) # [], 前面使用的是 '/' 而不是 ‘//’, 匹配的是根路径,导致无法查找
  3. 使用xpath 打开html文件时,会遇到无法解码为中文的情况
        html = etree.parse('./test_xpath.html', etree.HTMLParser())
        strings = etree.tostring(html)
        print(strings)
    
    # get page like this
    '''
    b'<!DOCTYPE html>\n<html lang="en">&#13;\n<head>&#13;\n    <meta charset="UTF-8"/>&#13;\n    <title>Title</title>&#13;\n</head>&#13;\n<body>&#13;\n<div class="name">&#13;\n    <div class="title">&#13;\n        <div class="price">&#13;\n            <span>&#13;\n                <a href="">&#32593;&#39029;&#27427;&#36175;</a>&#13;\n            </span>&#13;\n        </div>&#13;\n    </div>&#13;\n</div>&#13;\n</body>&#13;\n</html>'
    '''
        html = etree.parse('./test_xpath.html', etree.HTMLParser())
        strings = etree.tostring(html).decode()
        print(strings)
    '''
    <!DOCTYPE html>
    <html lang="en">&#13;
    <head>&#13;
        <meta charset="UTF-8"/>&#13;
        <title>Title</title>&#13;
    </head>&#13;
    <body>&#13;
    <div class="name">&#13;
        <div class="title">&#13;
            <div class="price">&#13;
                <span>&#13;
                    <a href="">&#32593;&#39029;&#27427;&#36175;</a>&#13;
                </span>&#13;
            </div>&#13;
        </div>&#13;
    </div>&#13;
    </body>&#13;
    </html>
    
    '''
    但是还是不对,中文并没有解析出来
    1. 使用etree.tostring()
    2. 使用etree.tounicode(), 则正常解析,并且不需要使用decode,就能得到正常的html
    3.     html = etree.parse('./test_xpath.html', etree.HTMLParser())
          strings = etree.tounicode(html)
          print(strings)
      
      
      <!DOCTYPE html>
      <html lang="en">&#13;
      <head>&#13;
          <meta charset="UTF-8"/>&#13;
          <title>Title</title>&#13;
      </head>&#13;
      <body>&#13;
      <div class="name">&#13;
          <div class="title">&#13;
              <div class="price">&#13;
                  <span>&#13;
                      <a href="">网页欣赏</a>&#13;
                  </span>&#13;
              </div>&#13;
          </div>&#13;
      </div>&#13;
      </body>&#13;
      </html>

       

 

 

 

 



movie_div = strings.xpath("//div[contains(@class,'doulist-item')]//text()")
movie_div = strings.xpath("//div[contains(@class,'doulist-item')]//text()")
'\n    '

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值