为了账号安全,请及时绑定邮箱和手机立即绑定

垂直抓取表格

垂直抓取表格

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.

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

csv 文件前 30 行

在此代码中,我在您的示例 html 代码上运行了 50 次循环,以生成更多的数据值。但是你需要为每一页提出一个新的请求并对其进行补充,但我想你明白了。这只是您如何编写代码的 POC。


查看完整回答
反对 回复 2023-04-18
  • 1 回答
  • 0 关注
  • 54 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信