首页 > 解决方案 > 使用 BeatifulSoup Python 仅从 HTML 文件中提取文本

问题描述

我有一个小问题。这是我的html文件:

<div class="titreArticle">   
<p class="titreArticleVisu rdp__articletitle">Analysis of proposed SBP Amendment Act</p>  
</div>

使用 beautifusoup,我想探索我的文件以便在标签中获取一些文本。

这是我在 Python 中的代码:

from bs4 import BeautifulSoup
import re
import calendar
import locale
from lxml import etree
import string

mess = "Entrez le chemin vers le fichier HTML Europress : "
html_source = "/Users/alancuzon/Desktop/test.HTML"
html = open(html_source, "r")
content = html.read()
soup = BeautifulSoup(content, "lxml")


#soup.find_all('span', class_='apd-sources-date', text=True)

exported_articles = []
articles = soup.findAll("article")
for a in articles:
    article = {}

    journal_title = a.find("span", {"class", "DocPublicationName"}).text
    article["journal"] = journal_title
    
    article_date = a.find("span", {"class", "DocHeader"}).text
    article["date"] = article_date
    
    
    exported_articles.append(article)

但是当我想获取示例标签的文本时出现错误。我的错误:

AttributeError                            Traceback (most recent call last)
<ipython-input-74-ff7c57861c92> in <module>
     23     article["journal"] = journal_title
     24 
---> 25     article_date = a.find("span", {"class", "DocHeader"}).text
     26     article["date"] = article_date
     27 

AttributeError: 'NoneType' object has no attribute 'text'

当我删除 .text 时,我只有 html 的字符串。你知道如何解决吗?为了只保留字符串?非常感谢!

标签: pythonbeautifulsoup

解决方案


ArributeError是由前一个选择器返回引起的None。我认为这可能是因为您没有使用正确的选择器按类名查找元素。

您正在使用:

{"class", "DocHeader"}

根据文档,它应该是

attrs={"class": "DocHeader"}

或者

class_="DocHeader"

尝试使用

for a in articles:
    article = {}

    journal_title = a.find("span", attrs={"class": "DocPublicationName"}).text
    article["journal"] = journal_title
    
    article_date = a.find("span", attrs={"class": "DocHeader"}).text
    article["date"] = article_date
    
    
    exported_articles.append(article)

如果这更容易,您还可以使用 css 选择器:

a.select_one(".DocHeader")

如果仍然得到None,则表示所选元素不存在 - 仔细检查类名是否正确。


推荐阅读