import requests
# pip install beautifulsoup4
from bs4 import BeautifulSoup


# 当你开始为方法函数取名字时候，不要用大写来表示，我们可以用_（下划线）隔开
def get_html_text(url):
    '''
    此函数用于获取网页的html文档
    '''
    try:
        # 获取服务器的响应内容，并设置最大请求时间为6秒
        res = requests.get(url, timeout=6)
        # 判断返回状态码是否为200
        res.raise_for_status()
        # 设置该html文档可能的编码
        res.encoding = res.apparent_encoding
        # 返回网页HTML代码
        return res.text
    except:
        return '产生异常'


def main():
    """
    函数说明要用三个双引号括起来,并且要位于方法名字下的第一行
    主函数
    """
    # 注释掉
    # global allHTML
    # 除了方法函数，变量的名字命名也是不能使用大写，我们用_（下划线分开）
    all_html = []

    # 目标网页，这个可以换成一个你喜欢的网站
    url = 'https://www.productsafety.gov.au/recalls/browse-all-recalls?search=&f%5B0%5D=field_accc_psa_product_category%3A4786&sort_by=accc_solr_date&items_per_page=200'

    demo = get_html_text(url)

    # 解析HTML代码
    soup = BeautifulSoup(demo, 'html.parser')

    # 模糊搜索HTML代码的所有包含href属性的<a>标签
    search = soup.find(class_="clearfix col-sm-push-4 col-sm-8")
    a_labels = search.find_all('a', attrs={'href': True})

    # 获取所有<a>标签中的href对应的值，即超链接
    for a in a_labels[0:200]:
        html = 'https://www.productsafety.gov.au' + str(a.get('href'))
        all_html.append(html)

    # global是一个不错的选择，但是每个方法都有return,要充分利用好return的作用
    # 我们在这里就开始使用return替代global
    return all_html


def get_test(b):
    # 获取单个网页文本
    page = requests.get(str(b))
    soup = BeautifulSoup(page.content, 'html.parser')
    defects_0 = soup.find(
        class_="field field-name-field-what-are-the-product-defec field-type-text-long field-label-above")
    defects = defects_0.find(class_="field-item even")
    place_0 = soup.find(
        class_="field field-name-field-where-the-product-was-sold field-type-list-text field-label-above")
    place = place_0.find(class_="field-items")
    supplier_0 = soup.find(class_="field field-name-field-psa-recall-supplier-name field-type-text field-label-above")
    supplier = supplier_0.find(class_="field-item even")
    # forecast_items = seven_day.find_all(class_ = "tombstone-container")
    # tonight = forecast_items[0]
    # print(tonight.prettify())
    # 之所以出现空格，是因为文本里最后有\n，它是换行的意思
    # 我们先来判断一下这行文本里有没有\n
    if "\n" in defects.get_text():
        print("这里面有!")
    # 我们去掉它
    # print("Defects:", defects.get_text())
    print("Defects:", defects.get_text().strip("\n"))
    print("Where:", place.get_text())
    print("Supplier:", supplier.get_text())


# 当你决定要测试一些方法是不是能正常运作的时候，把他们放到__main__里去
if __name__ == "__main__":
    all_links = main()
    # 因为single_html是all_links中的一个，是链接，所以命名要规范
    # single_html-->single_link
    for single_link in all_links[197:200]:
        print("=" * 15 + " NEXT " + "=" * 15)
        # print('\n', single_link)
        print(single_link)
        get_test(single_link)

    print("#" * 30)
    # 如果向随机抽取几个html来解析，我们可以用random模块，实现一个随机选取的功能
    # 先导入random
    import random
    # 使用choice方法
    random_link = random.choice(all_links)
    get_test(random_link)
