首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >加拿大统计局数据来源的Web刮刀

加拿大统计局数据来源的Web刮刀
EN

Code Review用户
提问于 2022-10-05 15:26:21
回答 1查看 135关注 0票数 5

我写了从加拿大统计局抓取数据的解析器

代码语言:javascript
复制
import re
import pandas as pd
import requests
from bs4 import BeautifulSoup


def get_number_of_sources() -> int:
    '''
    Retrieves Number of STATCAN Sources
    Returns
    -------
    int
        Number of STATCAN Sources.
    '''
    URL = 'https://www150.statcan.gc.ca/n1/en/type/data'
    page = requests.get(URL)
    soup = BeautifulSoup(page.text, 'lxml')
    result = re.search(r'\((.*?)\)', soup.summary.get_text()).group(1)
    return int(result.replace(',', ''))


def main():
    '''
    Builds Resulting DataFrame and Dumps It To Excel File
    Returns
    -------
    None.
    '''
    FILE_NAME = 'stat_can_all.xlsx'
    number_of_sources = get_number_of_sources()
    data_list = []
    for _ in range(1 + number_of_sources // 100):
        GENERIC_URL = 'https://www150.statcan.gc.ca/n1/en/type/data?count=100&p={}-All#all'
        page = requests.get(GENERIC_URL.format(_))
        print(f'Parsing Page {1+_:3} Out of {1+number_of_sources // 100}')
        soup = BeautifulSoup(page.text, 'lxml')
        details_soup = soup.find('details', id='all')
        items = details_soup.find_all('li', {'class': 'ndm-item'})
        for item in items:
            tag_description = item.find('div', class_='ndm-result-description')
            tag_former_id = item.find('div', class_='ndm-result-formerid')
            tag_frequency = item.find('div', class_='ndm-result-freq')
            tag_geo = item.find('div', class_='ndm-result-geo')

            data_list.append(
                {
                    'title': item.find('div', class_='ndm-result-title').get_text(),
                    'product_id': item.find('div', class_='ndm-result-productid').get_text(),
                    'former_id': None if tag_former_id is None else tag_former_id.get_text(),
                    'geo': None if tag_geo is None else tag_geo.get_text(),
                    'frequency': None if tag_frequency is None else tag_frequency.get_text(),
                    'description': None if tag_description is None else tag_description.get_text(),
                    'release_date': item.find('span', class_='ndm-result-date').get_text(),
                    'type': item.find(
                        'div',
                        class_='ndm-result-productid'
                    ).get_text().split(':')[0],
                    'ref': item.a.get('href'),
                }
            )

    data = pd.DataFrame.from_dict(data_list)
    data[['id', 'title_only']] = data.iloc[:, 0].str.split(
        pat='. ',
        n=1,
        expand=True
    )
    data['id'] = pd.to_numeric(data['id'].str.replace(',', ''))
    data.fillna('None').to_excel(FILE_NAME, index=False)


if __name__ == '__main__':
    main()

我想知道是否有一种方法可以对以下代码行和表示三元操作符的类似代码行进行重新表述:

代码语言:javascript
复制
'former_id': None if tag_former_id is None else tag_former_id.get_text()

让它更优雅、更简洁。

您可以看到,如果tag_former_idclass bs4.element.Tag的一个实例,则可以使用.get_text()方法检索str

否则,tag_former_id可能是None,不需要进一步的操作。

请您回顾这篇文章,并指出偏离最佳实践的地方吗?

任何其他改进建议也很受欢迎,例如在代码中引入更多的功能方法等等。

EN

回答 1

Code Review用户

回答已采纳

发布于 2022-10-05 20:32:43

对于关于三元运算符的特殊问题,您可以使用and

代码语言:javascript
复制
'former_id': tag_former_id and tag_former_id.get_text(),

我不认为这是超级漂亮/明显,但它比全三值运算符更紧凑。

而不是CONSTANT变量,例如FILE_NAME。我建议用默认参数替换这些参数:

代码语言:javascript
复制
def main(
    file_name='stat_can_all.xlsx',
    ...
):

文档字符串应该使用"""而不是'''。此外,虽然您的格式非常漂亮,但您会有更好的运气(更好的IDE集成、Sphinx解析等)。如果你使用标准格式。谷歌风格是一种非常流行的格式。

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/280222

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档