我正在尝试抓取一个网站的页面,该页面的信息用嵌套表格组织在
<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>
...
换句话说,我如何搜索包含特定文本的标签,但获得该标签的远祖?用例是我需要此处描述的最外层表中的大量数据,但是我可以搜索该父表的属性,因此我需要根据其后代进行搜索。
我尝试过只是搜索,但表格太多了,因为页面几乎完全是用它们组织的,所以很难挑选并准确找到我需要的内容。我希望找到一种方法来搜索后代满足条件的标签。如果我可以检查某个深度的后代(例如,如果我知道跨度位于表的该深度,我可以搜索它吗?),那就更好了,因为最外面的表将在其中包含所有这些表,因此也满足某些后代拥有所需文本的条件。
您可以使用
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