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可以看出,findAll
是find_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()
我正在使用此代码:
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可以看出,findAll
是find_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()