亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

垂直抓取表格

垂直抓取表格

12345678_0001 2023-04-18 16:14:38
首先讓我說我討厭問一個非常盲目的“請為我寫它”式的問題,因為我自己通常喜歡學習這樣的東西,但我時間緊迫。最重要的是,昨天是我第一次得知 BeautifulSoup 的存在,而且我已經有大約 7 年沒有編寫任何真正的腳本或編碼了,所以我來了。簡而言之,我正在嘗試創建一個抓取工具來遍歷包含垂直排列的表格的多個頁面,并將數據輸出到 csv。因此,在第一遍中,我需要讀取第一列以在我的 CSV 中創建標題行,然后對于其余 URL,只需讀取第二列以創建數據行。我想我可以弄清楚如何使用 URL 遍歷輸入文件,但如果有人對此有快速了解,我的計劃是一個輸入文件,每行都有一個 url。該表的編碼非常糟糕,有大量的空格和回車符,但我想我已經處理好了。我被卡住的地方是垂直循環遍歷列。為了方便起見,表結構如下所示:<div id="mydiv">    <table>      <tr>        <td>header 1</td>        <td>value 1</td>      </tr>      <tr>        <td>header 2</td>        <td>value 2</td>      </tr>      <tr>        <td>header 3</td>        <td>value 3</td>      </tr>    </table></div>昨天我在 google 上玩了 30 分鐘,把我帶到了可以將表格導出為 CSV 并刪除所有多余字符的地方。它是頁面上的第一個,沒有 ID,但到目前為止我寫的只是輸出那個表。表所在的 DIV 似乎有一個唯一的 ID,所以如果涉及到它,我可能可以隔離它。from bs4 import BeautifulSoupimport requestsimport csvurl="https://myurl.com/"html = requests.get(url).textsoup = BeautifulSoup(html, "lxml")table = soup.find("table")output_rows = []for table_row in table.findAll('tr'):    columns = table_row.findAll('td')    output_row = []    for column in columns:         output_row.append(' '.join(column.text.split()))    output_rows.append(output_row)with open('output.csv', 'w') as csvfile:    writer = csv.writer(csvfile)    writer.writerows(output_rows)這讓我把表格刮成水平格式(盡管 CSV 中每行數據之間有一條額外的線,我還沒有弄清楚)。但我需要的是跨多個 URL 垂直抓取它,最后得到一個如下所示的 CSV:header1,header2,header3value1,value2,value3value1,value2,value3 (from next URL in the list)value1,value2,value3 (from next url in the list and so on)
查看完整描述

1 回答

?
浮云間

TA貢獻1829條經驗 獲得超4個贊

沒有更多信息,我想這會對您有所幫助:


from bs4 import BeautifulSoup

import pandas as pd

html = '''<div id="mydiv">

    <table>

      <tr>

        <td>header 1</td>

        <td>value 1</td>

      </tr>

      <tr>

        <td>header 2</td>

        <td>value 2</td>

      </tr>

      <tr>

        <td>header 3</td>

        <td>value 3</td>

      </tr>

    </table>

</div>'''

num = 0

headers = []

values = []

rows = []

while True:

    soup = BeautifulSoup(html, 'html.parser')


    trs = soup.select('div#mydiv tr')

    for t in trs:

        for header, value in zip(t.select('td')[0], t.select('td')[1]):

            if num == 0:

                headers.append(header)

            values.append(value)

    rows.append(values)

    values = []

    num += 1

    if num > 50:

        break

df = pd.DataFrame(rows, columns= headers)

print(df.head())


df.to_csv('mycsv.csv')

印刷:


  header 1 header 2 header 3

0  value 1  value 2  value 3

1  value 1  value 2  value 3

2  value 1  value 2  value 3

3  value 1  value 2  value 3

4  value 1  value 2  value 3

依此類推...并將數據保存到名為mycsv.csv.

http://img1.sycdn.imooc.com//643e519e00010b3a04130652.jpg

csv 文件前 30 行

在此代碼中,我在您的示例 html 代碼上運行了 50 次循環,以生成更多的數據值。但是你需要為每一頁提出一個新的請求并對其進行補充,但我想你明白了。這只是您如何編寫代碼的 POC。


查看完整回答
反對 回復 2023-04-18
  • 1 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號