xpath &


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標簽的信息。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM