首页 > 解决方案 > 抓取网站以仅显示填充的类别

问题描述

我正在抓取一个网站,它会提取页面的内容,但是有些类别的标题在技术上是空的,但它仍然显示标题。我只想查看包含事件的类别。理想情况下,我什至可以拥有每个事务的组件,这样我就可以选择要显示的元素。

import requests
from bs4 import BeautifulSoup

headers = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36'}

print('Scraping NH Dept of Banking...')
print()

NHurl = 'https://www.nh.gov/banking/corporate-activities/index.htm'
NHr = requests.get(NHurl, headers = headers)

NHsoup = BeautifulSoup(NHr.text, 'html.parser')

NHlist = []

for events in NHsoup.findAll('tr')[2:]:
    print(events.text)
    NHlist.append(events.text)
print(' '.join(NHlist))

就像我说的那样,这可以获取所有信息,但是有很多标题/空白空间不需要拉出。例如,在我写这篇文章的时候,'acquisitions'、'conversions'和'change in control'是空的,但标题仍然存在,并且在标题之后有相对较大的空白。我觉得我需要某种循环来遍历每个标题('td'),然后获取它的内容('tr'),但我不太确定该怎么做。

标签: pythonweb-scraping

解决方案


您可以测试哪些行包含所有“\xa0”(显示为空白)并排除。我追加到列表并转换为熊猫数据框,但您可以直接打印该行。

import requests
from bs4 import BeautifulSoup as bs
import pandas as pd

r = requests.get('https://www.nh.gov/banking/corporate-activities/index.htm')
soup = bs(r.content, 'lxml')
results = []

for tr in soup.select('tr'):
    row = [i.text for i in tr.select('th,td')]
    if row.count('\xa0') != len(row):
        results.append(row)

pd.set_option('display.width', 100)
df = pd.DataFrame(results)
df.style.set_properties(**{'text-align': 'left'})   
df.columns = df.iloc[0] 
df = df[1:]
df.fillna(value='', inplace=True)
print(df.head(20))

推荐阅读