首页 > 解决方案 > 编写 JSON 文件和 Python

问题描述

下午好,我找到了一个带有解析器的代码示例,它解析站点,从那里获取文章的标题、指向它的链接和简短描述,并将这些数据写入 JSON 文件。我为我需要的网站重新做了一点,但当然一切都不能正常工作。写入后,所有文章的“title”和“desc”数据都记录相同,但“url”和“id”一切都很好,应该是这样。请帮我解决问题。我会非常感谢。

这是代码:

import json
import requests
from bs4 import BeautifulSoup


def get_first_news():
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.64"
    }

    url = "https://bmr.gov.ua/index.php?id=2&no_cache=1"
    r = requests.get(url=url, headers=headers)

    soup = BeautifulSoup(r.text, "lxml")
    articles_cards = soup.find_all("div", class_="article articletype-0")

    news_dict = {}
    for article in articles_cards:
        article_title = article.find("h3").text.strip()
        article_desc = article.find("p").text.strip()

        for i in soup.find_all('a', class_='more', href=True):
        
            article_url = (f'https://bmr.gov.ua/{i["href"]}')
        

            article_id = article_url.split("/")[-1]
        

        # print(f"{article_title} | {article_url}")

            news_dict[article_id] = {

                "article_title": article_title,
                "article_url": article_url,
                "article_desc": article_desc

            }

        with open("news_dict.json", "w", encoding='utf-8') as file:
            json.dump(news_dict, file, indent=4, ensure_ascii=False)

这是写入 json 的结果:

在此处输入图像描述

标签: pythonjsonparsing

解决方案


你犯了错误for i in soup.find_all('a', class_='more', href=True):,你应该尝试在<a class="more">里面找到,article但你正在里面搜索soup

这是工作代码:

import json
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/91.0.4472.124 Safari/537.36 Edg/91.0.864.64"
}

url = "https://bmr.gov.ua/index.php?id=2&no_cache=1"
r = requests.get(url=url, headers=headers)

soup = BeautifulSoup(r.text, "lxml")
articles_cards = soup.find_all("div", class_="article articletype-0")

news_dict = {}
for article in articles_cards:
    article_title = article.find("h3").text.strip()
    article_desc = article.find("p").text.strip()

    for i in article.find_all('a', class_='more', href=True):    
        article_url = (f'https://bmr.gov.ua/{i["href"]}')
        article_id = article_url.split("/")[-1]
    
        news_dict[article_id] = {
            "article_title": article_title,
            "article_url": article_url,
            "article_desc": article_desc}

with open("news_dict.json", "w", encoding='utf-8') as file:
    json.dump(news_dict, file, indent=4, ensure_ascii=False)

如果这解决了您的问题,请不要忘记将此标记为已接受的答案。


推荐阅读