zoukankan      html  css  js  c++  java
  • xpath & <tr><td><br>

    python : 3.6

    lxml : 4.2.1

    from lxml.html import etree
    
    test_html = '''
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <body>
    <table id="report1">
        <tr rn="1" >
            <td class="report1_1">1</td>
            <td class="report1_1">2<br>3<br>4</td>
        </tr>
        <tr rn="1" >
            <td class="report1_1">1.1</td>
            <td class="report1_1">2.1<br>3.1<br>4.1</td>
        </tr>
    </table>
    </body>
    </html>
    '''
    
    if __name__ == '__main__':
        html = etree.HTML(test_html)
        tag1 = html.xpath('/html/body/table/tr/td[1]')
        tag2 =  html.xpath('/html/body/table/tr/td[2]')
        tag3 = html.xpath('/html/body/table/tr/td[2]/text()')
        print('tag1-[0]-->',tag1[0].text)
        print('tag2-[0]-->',tag2[0].text)
        print('tag2-[1]-->', tag2[1].text)
        print('tag3-->',tag3)
    
        b = [str(i) for i in tag3]
        str = ''.join(b)
        print('tag3-str-->',str)
    
        print('tag2-->',tag2)
        print('tag2[0]-string-->',tag2[0].xpath('string(.)'))
        print('tag2[1]-string-->',tag2[1].xpath('string(.)'))
    tag1-[0]--> 1
    tag2-[0]--> 2
    tag2-[1]--> 2.1
    tag3--> ['2', '3', '4', '2.1', '3.1', '4.1']
    tag3-str--> 2342.13.14.1
    tag2--> [<Element td at 0x18b9478aec8>, <Element td at 0x18b9478af88>]
    tag2[0]-string--> 234
    tag2[1]-string--> 2.13.14.1

    代码在上面。

    简单说一说:

    requests配合xpath来抓网站数据的时候,不像selenium+xpath。

    selenium有  find_element  find_elements,区别是带S ,查找第一个元素,和查找所有元素。

    requests只有xpath,简单粗暴的直接查找所有元素。所以tag1,要带下标[0]来输出第一个对象,并且用.text来输出文字信息。

    tag2,带下标[0]来输出第一个对象,并且用.text来输出文字信息。但是由于对象中有<br>标签,所以只能取得第一个<br>标签前面的数据。

    tag3,我们在xpath规则中加入.text()规则,取得这个标签中的文字信息。由于有<br>标签,文字信息会因为<br>而分割称为列表。

    我们可以自己重组列表,转为字符串:

    b = [str(i) for i in tag3]
    str = ''.join(b)
    print('tag3-str-->',str)

    或者不使用text()规则使用xpath('string(.)'):

    print('tag2-->',tag2)
    print('tag2[0]-string-->',tag2[0].xpath('string(.)'))
    print('tag2[1]-string-->',tag2[1].xpath('string(.)'))

    两种方式都可以正常获取td标签中带br标签的信息。

  • 相关阅读:
    关机相关(shutdown,reboot)
    软件架构学习小结
    颜色空间RGB与HSV(HSL)的转换
    OData语法
    拷贝构造函数,深拷贝,大约delete和default相关业务,explicit,给定初始类,构造函数和析构函数,成员函数和内联函数,关于记忆储存,默认参数,静态功能和正常功能,const功能,朋友
    登录模块
    TextView 使用自定义的字体和亮点
    基于Hama并联平台Finding a Maximal Independent Set 设计与实现算法
    VS2012使用XListCtrl
    ThinkPHP 3.2 开放 cache注缓存,过滤非法字符
  • 原文地址:https://www.cnblogs.com/jackadam/p/8878336.html
Copyright © 2011-2022 走看看