BeautifulSoup4:如何查找所有具有远方后代且其中包含特定文本的表?

问题描述 投票:0回答:1

我正在尝试抓取一个网站的页面,该页面的信息用嵌套表格组织在

<table>
中。特别是,我想要的特定表格都有一个嵌套的
<table>
,其中
<tr>
包含
<th>
,其中
<span>
包含某些文本。

类似这样的:

<table>
  <tbody>
    <tr>
      <td>
        <table>
          <tbody>
            ...
            <tr>
              <th>
                <span>Text that should be in each table i want to get</span>
              </th>
            ...

换句话说,我如何搜索包含特定文本的标签,但获得该标签的远祖?用例是我需要此处描述的最外层表中的大量数据,但是我可以搜索该父表的属性,因此我需要根据其后代进行搜索。

我尝试过只是搜索,但表格太多了,因为页面几乎完全是用它们组织的,所以很难挑选并准确找到我需要的内容。我希望找到一种方法来搜索后代满足条件的标签。如果我可以检查某个深度的后代(例如,如果我知道跨度位于表的该深度,我可以搜索它吗?),那就更好了,因为最外面的表将在其中包含所有这些表,因此也满足某些后代拥有所需文本的条件。

python html web-scraping beautifulsoup
1个回答
0
投票

您可以使用

find_all()
在树中向下查找,查找包含该文本的后代标签。然后使用
find_parents()
回到树上,查看标签的父级。

以下是在页面上查找标题文本并查找其父表标签的代码概要。

from bs4 import BeautifulSoup
from urllib2 import urlopen
import re

PAGE_URL = "https://..."
FIXED_HEADING_PATTERN = "Fixed text"

soup = BeautifulSoup(urlopen(PAGE_URL).read())
pattern = re.compile(FIXED_HEADING_PATTERN)

headings = soup.findAll("span", text=pattern)

# For each heading found create a list of it's parent tables
for heading in headings:
    parent_tables = [t for t in heading.find_parents("table")]
    # Use parent_tables
© www.soinside.com 2019 - 2024. All rights reserved.