首页 > 解决方案 > 网络抓取问题以清理 CSV 表

问题描述

我正在尝试从表中抓取一些数据。我得到了我期望的结果,但我找不到将它们保存在干净的 CSV 表中的方法。这是代码,低于结果和我想要的。有什么建议吗?

from bs4 import BeautifulSoup
import urllib.request # web access
import csv
import re

url = "https://wsc.nmbe.ch/family/87/Senoculidae"
page = urllib.request.urlopen(url) # conntect to website
try:
    page = urllib.request.urlopen(url)
except:
    print("Ups!")
soup = BeautifulSoup(page, 'html.parser')

regex = re.compile('^speciesTitle')
content_lis = soup.find_all('div', attrs={'class': regex})

for li in content_lis:
    con = li.get_text("#",strip=True).split("\n")[0]
    print(con)

我得到了这些不错的输出:

Senoculus albidus#(F. O. Pickard-Cambridge, 1897)#|#| Brazil
Senoculus barroanus#Chickering, 1941#|#| Panama
Senoculus bucolicus#Chickering, 1941#|#| Panama

但我需要这样的东西(用分号或制表符分隔的 CSV):

Senoculus albidus;(F. O. Pickard-Cambridge, 1897);Brazil
Senoculus barroanus;Chickering1941;Panama
Senoculus bucolicus;Chickering, 1941;Panama

如何删除字符“|” 和一些空间?有什么建议吗?

此致

标签: pythonweb-scrapingbeautifulsoup

解决方案


此代码基于您的示例数据集工作:

lst=[
'Senoculus albidus#(F. O. Pickard-Cambridge, 1897)#|#| Brazil',
'Senoculus barroanus#Chickering, 1941#|#| Panama',
'Senoculus bucolicus#Chickering, 1941#|#| Panama'
]

lst2 = [s.replace('|',"").split('#') for s in lst]

lst3=[]

for s in lst2:
   lst3.append(';'.join([sx.strip() for sx in s]).replace(';;',';'))

for s in lst3:
   print(s)

输出

Senoculus albidus;(F. O. Pickard-Cambridge, 1897);Brazil 
Senoculus barroanus;Chickering, 1941;Panama 
Senoculus bucolicus;Chickering, 1941;Panama

--- 根据请求者评论更新 ---

在最终循环中添加一行:

for li in content_lis:
    con = li.get_text("#",strip=True).split("\n")[0]
    con = ';'.join(sx.strip() for sx in con.replace('|',"").split('#')).replace(';;',';') # add this line
    print(con)

推荐阅读