python簡單爬蟲 用lxml解析頁面中的表格


目標:爬取湖南大學2018年在各省的錄取分數線,存儲在txt文件中

 

部分表格如圖:

 

部分html代碼:

 

<table cellspacing="0" cellpadding="0" border="1">
   <tbody>
    <tr class="firstRow" >
     <td rowspan="2" ><p ><strong><span >省份</span></strong></p></td>
     <td colspan="4" ><p ><strong><span >文科</span></strong></p></td>
     <td colspan="4" ><p ><strong><span >理科</span></strong></p></td>
    </tr>
    <tr >
     <td ><p ><strong><span >一本線</span></strong></p></td>
     <td ><p ><strong><span >藝術類</span></strong></p></td>
     <td ><p ><strong><span >高校專項計划</span></strong></p></td>
     <td ><p ><strong><span >普通類</span></strong></p></td>
     <td ><p ><strong><span >一本線</span></strong></p></td>
     <td ><p ><strong><span >高校專項計划</span></strong></p></td>
     <td ><p ><strong><span >國家專項計划</span></strong></p></td>
     <td ><p ><strong><span >普通類</span></strong></p></td>
    </tr>
    <tr >
     <td ><p ><strong><span >北京</span></strong></p></td>
     <td valign="middle" align="left"><p ><span ><strong><span lang="EN-US">576</span></strong></span></p></td>
     <td valign="middle" align="left"><br></td>
     <td valign="middle" align="left"><br></td>
     <td valign="middle" align="left"><p ><span ><strong><span lang="EN-US">633</span></strong></span></p></td>
     <td valign="middle" align="left"><p ><span ><strong><span lang="EN-US">532</span></strong></span></p></td>
     <td valign="middle" align="left"><br></td>
     <td valign="middle" align="left"><br></td>
     <td valign="middle" align="left"><p ><span ><strong><span lang="EN-US">624</span></strong></span></p></td>
    </tr>
    <tr >
     <td ><p ><strong><span >天津</span></strong></p></td>
     <td valign="middle" align="left"><p ><span ><strong><span lang="EN-US">436/527</span></strong></span></p></td>
     <td valign="middle" align="left"><br></td>
     <td valign="middle" align="left"><br></td>
     <td valign="middle" align="left"><p ><span ><strong><span lang="EN-US">614</span></strong></span></p></td>
     <td valign="middle" align="left"><p ><span ><strong><span lang="EN-US">407/554</span></strong></span></p></td>
     <td valign="middle" align="left"><br></td>
     <td valign="middle" align="left"><br></td>
     <td valign="middle" align="left"><p ><span ><strong><span lang="EN-US">626</span></strong>&nbsp;</span></p></td>
    </tr>

  ......

    <tr >
     <td ><p ><strong><span >上海</span></strong></p></td>
     <td colspan="8" valign="top"><p ><strong><span >本科線</span></strong><strong><span lang="EN-US">/</span></strong><strong><span >自主招生參考線:</span></strong><strong><span lang="EN-US">401/502</span></strong><strong><span >;</span></strong><strong><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></strong><strong><span >(專業組)最低投檔線:<span >533</span></span></strong></p></td>
    </tr>
    <tr >
     <td ><p ><strong><span >浙江</span></strong></p></td>
     <td colspan="8" valign="top"><p ><strong><span >本科線</span></strong><strong><span lang="EN-US">/</span></strong><strong><span >一段線:</span></strong><strong><span lang="EN-US">344/588</span></strong><strong><span >;</span></strong><strong><span lang="EN-US">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; </span></strong><strong><span >(專業)最低投檔線:639</span></strong></p></td>
    </tr>
   </tbody>
  </table>

 

代碼:

 

import requests
from lxml import etree

# 設置URL地址和請求頭
url = 'http://admi.hnu.edu.cn/info/1024/3094.htm'
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.92 Safari/537.36',
    'Cookie': 'ASP.NET_SessionId=yolmu555asckw145cetno0um'
}

# 發送請求並解析HTML對象
response = requests.get(url, headers=headers)
html = etree.HTML(response.content.decode('utf-8'))

#  數據解析
table = html.xpath("//table//tr[position()>2]")  # XPath定位到表格,因為頁面只有一個表格,所以直接//table,
# 如果有多個表格,如取第二個表格,則寫為//table[1] 偏移量為1 。我們不取表頭信息,所以從tr[3]開始取,返回一個列表

dep = []

for i in table:  # 遍歷tr列表
    p = ''.join(i.xpath(".//td[1]//text()"))  # 獲取當前tr標簽下的第一個td標簽,並用text()方法獲取文本內容,賦值給p
    sl = ''.join(i.xpath(".//td[6]//text()"))
    sc = ''.join(i.xpath(".//td[9]//text()"))
    ll = ''.join(i.xpath(".//td[2]//text()"))
    lc = ''.join(i.xpath(".//td[5]//text()"))

    print(p, sl, sc, ll, lc)
    data = {  # 用數據字典,存儲需要的信息
        '省份': ''.join(p.split()),  # .split()方法在此處作用是除去p中多余的空格 '\xa0'
        '理科一本線': ''.join(sl.split()),
        '理科投檔線': ''.join(sc.split()),
        '文科一本線': ''.join(ll.split()),
        '文科投檔線': ''.join(lc.split())
    }
    print(data)
    dep.append(data)


#數據存儲
with open('2018enro.txt', 'w', encoding='utf-8') as out_file:
    out_file.write("湖南大學:"+"2018年各省錄取分數線:\n\n")
    for i in dep:
        out_file.write(str(i)+'\n')

 

注:原本數據字典是這樣寫的:

for i in table:
    data = {  # 用數據字典,存儲需要的信息
        '省份': ''.join(i.xpath(".//td[1]//text()")), 
        '理科一本線': ''.join(i.xpath(".//td[6]//text()")),
        '理科投檔線': ''.join(i.xpath(".//td[9]//text()")),
        '文科一本線': ''.join(i.xpath(".//td[2]//text()")),
        '文科投檔線': ''.join(i.xpath(".//td[5]//text()"))
    }

 

輸出結果有很多‘\xa0’,其實就是空格,源網頁中就字段里就存在很多空格:

 

 

plus:解析表格有更好的方法,比如pandas,一步到位!非常方便。

詳情請看我的另一篇文章:

https://www.cnblogs.com/cttcarrotsgarden/p/10769097.html

 


免責聲明!

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



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