如何在 bs4 中对 find_all() 的标签进行部分调节?
How to do a partial conditioning on a tag for find_all() in bs4?
我有一个 xml,它有多个标签,如下所示:
<textblock height="55" hpos="143" id="Page1_Block5" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
我想获得所有 <textblock>
标签由一个页面聚类(id
属性 在 textblock
标签中)。但是,我的id是这样写的:id="Page1_Block5"
.
但是,我只想以页码为条件,而不是块号。 (我想要特定页面的所有块)。
我正在尝试通过以下方式做同样的事情:
xml_soup = bs.BeautifulSoup(table, 'lxml')
text_blocks = xml_soup.find_all('textblock')
我还需要在 find_all()
函数中添加哪些参数才能仅在 Page{}
上调整我的结果?
这应该对你有帮助:
text_blocks = xml_soup.find_all('textblock', id = lambda value: value and value.startswith("Page1"))
这是我的全部代码:
from bs4 import BeautifulSoup
xml = """
<textblock height="55" hpos="143" id="Page1_Block5" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
"""
xml_soup = BeautifulSoup(xml,'lxml')
text_blocks = xml_soup.find_all('textblock', id = lambda value: value and value.startswith("Page1"))
解释:
lambda 函数检查 id
是否以 Page1
开头。如果是,则它检索标签。我还向 xml
变量添加了更多值。这是我使用的测试数据:
xml = """
<textblock height="55" hpos="143" id="Page1_Block5" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
<textblock height="55" hpos="143" id="Page1_Block4" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
<textblock height="55" hpos="143" id="Page2_Block5" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
<textblock height="55" hpos="143" id="Page1_Block1" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
"""
如您所见,有 3 个 textblock
标签带有以 Page1
开头的 id
。当我 运行 我的代码使用这个测试数据并打印出变量的长度 text_blocks
时,这是我得到的输出:
>>> len(text_blocks)
3
这表明代码有效!希望这对您有所帮助!
P.S:您可以参考 link 以获取有关提取具有以特定字符串开头的 id
的元素的更多详细信息。
我有一个 xml,它有多个标签,如下所示:
<textblock height="55" hpos="143" id="Page1_Block5" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
我想获得所有 <textblock>
标签由一个页面聚类(id
属性 在 textblock
标签中)。但是,我的id是这样写的:id="Page1_Block5"
.
但是,我只想以页码为条件,而不是块号。 (我想要特定页面的所有块)。
我正在尝试通过以下方式做同样的事情:
xml_soup = bs.BeautifulSoup(table, 'lxml')
text_blocks = xml_soup.find_all('textblock')
我还需要在 find_all()
函数中添加哪些参数才能仅在 Page{}
上调整我的结果?
这应该对你有帮助:
text_blocks = xml_soup.find_all('textblock', id = lambda value: value and value.startswith("Page1"))
这是我的全部代码:
from bs4 import BeautifulSoup
xml = """
<textblock height="55" hpos="143" id="Page1_Block5" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
"""
xml_soup = BeautifulSoup(xml,'lxml')
text_blocks = xml_soup.find_all('textblock', id = lambda value: value and value.startswith("Page1"))
解释:
lambda 函数检查 id
是否以 Page1
开头。如果是,则它检索标签。我还向 xml
变量添加了更多值。这是我使用的测试数据:
xml = """
<textblock height="55" hpos="143" id="Page1_Block5" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
<textblock height="55" hpos="143" id="Page1_Block4" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
<textblock height="55" hpos="143" id="Page2_Block5" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
<textblock height="55" hpos="143" id="Page1_Block1" lang="en-US" stylerefs="StyleId-E6BF91A3-3D6A-442F-9A46-22A0459A02E9- font1" vpos="226" width="393">
"""
如您所见,有 3 个 textblock
标签带有以 Page1
开头的 id
。当我 运行 我的代码使用这个测试数据并打印出变量的长度 text_blocks
时,这是我得到的输出:
>>> len(text_blocks)
3
这表明代码有效!希望这对您有所帮助!
P.S:您可以参考 id
的元素的更多详细信息。