Beautiful Soup 4 HTML 文档目录

Beautiful Soup 4 HTML Documents Directory

我正在使用此代码:

from bs4 import BeautifulSoup
import glob
import os
import re

def trade_spider():
    os.chdir(r"C:\Users30p\FLO'S DATEIEN\Master FAU\Sommersemester 2016_Masterarbeit_Testumgebung_Probedateien für Analyseaspekt\Independent Auditors Report")
    for file in glob.glob('*.html'):
        with open(file, encoding="utf8") as f:
            contents = f.read()
            soup = BeautifulSoup(contents, "html.parser")
            results = [item for item in soup.findAll("ix:nonfraction") if re.match("^[^:]:AuditFeesExpenses", item['name'])]
            print(results)
                #print(file, end="| ")
                #print(item['name'], end="| ")
                #print(item.get_text())
trade_spider()

我正在尝试使用 BS4 解析计算机上某个目录中的多个 HTML 文档。我的目标是找到以 "ix:NonFraction...." 开头的标签,其中包含一个名称属性,该名称属性可以在 'AuditFeesExpenses' 之前有多个表达式,例如 name="aurep:AuditFeesExpenses, name=bus:AuditFeesExpenses" 等(这就是我使用 RegEx 的原因)。所以,如果 BS4 找到了那个特定的标签,我想用 soup.get_text(Value).

从中提取文本

有人知道我错过了什么吗?

更新: 示例标记为:

    <td style=" width:12.50%; text-align:right; " class="ta_60">
<ix:nonFraction contextRef="ThirdPartyAgentsHypercube_FY_31_12_2012_Set1"
 name="ns19:AuditFeesExpenses" unitRef="GBP" decimals="0"
 format="ixt2:numdotdecimal" scale="0" xmlns:ix="http://www.xbrl.org
/2008/inlineXBRL">3,600</ix:nonFraction></td>

通常这个标签出现在一行中,为了清楚起见,我插入了一些换行符!

我的最终代码如下所示:

from bs4 import BeautifulSoup
import glob
import os
import re

def trade_spider():
    os.chdir(r"C:\Users30p\FLO'S DATEIEN\Master FAU\Sommersemester 2016_Masterarbeit_Testumgebung_Probedateien für Analyseaspekt\Independent Auditors Report")
    for file in glob.glob('*.html'):
        with open(file, encoding="utf8") as f:
            contents = f.read()
            soup = BeautifulSoup(contents, "html.parser")
            for item in soup.findAll("ix:nonfraction"):
                if re.match(".*AuditFeesExpenses", item['name']):
                    print(file, end="| ")
                    print(item['name'], end="| ")
                    print(item.get_text())
trade_spider()

并给我这个输出:

Prod224_0010_00079350_20140331.html| uk-aurep:AuditFeesExpenses| 2,000

findAll() 函数的第一个参数是 name。当你打电话给

`soup.findAll('ix:NonFraction', name=re.compile("^[^:]:AuditFeesExpenses"))`, 

您实际上是在使用参数 name=ix:NonFraction AND name=re.compile("^[^:]:AuditFeesExpenses") 调用 soup。当然,我们只能将 name 设置为这两个输入之一,给出错误。

错误消息显示 find_all() 而不是 findAll()。从docs可以看出,findAllfind_all的旧方法名。应使用 find_all 方法。

混淆可能来自属性 name。区分 BeautifulSoup 属性 name 和 html 属性 name 很重要。为了演示,我假设标签具有以下格式:

<body>
    <ix:NonFraction name="AuditFeesExpenses">stuff<ix:NonFraction>
</body>

我们可以找到所有带有 soup.find_all("ix:nonfraction")<ix:NonFraction> 标签。这给出了包含结果的以下列表:

[<ix:NonFraction name="AuditFeesExpenses">stuff<ix:NonFraction>]

遍历此单项列表以查看两个不同 名称属性。首先,我们访问BeautifulSoupname属性作为对象的一个​​属性:

for item in soup.find_all("ix:nonfraction"):
    print(item.name)

Out: 'ix:nonfraction'

要查看 html 名称属性,请将 name 作为字典键访问:

for item in soup.find_all("ix:nonfraction"):
    print(item['name'])

Out: 'AuditFeesExpenses'

将两个搜索结合在一起以缩小结果范围:

results = [item for item in soup.find_all("ix:nonfraction") if re.match("^[^:]:AuditFeesExpenses", item['name'])

Out: [<ix:nonfraction name="ns19:AuditFeesExpenses">3,600</ix:nonfraction>]

或者,如果我们想要获取每个匹配项的文本:

results = [item.get_text() for item in soup.find_all("ix:nonfraction") if re.match("^[^:]:AuditFeesExpenses", item['name'])

Out: [3,600]

完整输出的建议代码:

from bs4 import BeautifulSoup
import glob
import os

def trade_spider():
    os.chdir(r"C:\Independent Auditors Report")
    for file in glob.glob('*.html'):
        with open(file, encoding="utf8") as f:
            contents = f.read()
            soup = BeautifulSoup(contents, "html.parser")
            for item in soup.findAll("ix:nonfraction"):
                if re.match("^[^:]:AuditFeesExpenses", item['name'])
                    print(file, end="| ")
                    print(item['name'], end="| ")
                    print(item.get_text())
trade_spider()