无条件停止在指定元素(或EOF)处抓取HTML

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

我正在使用 Python

lxml.html
包来抓取 HTML 文件。 我试图抓取的 HTML 部分读取

<h1>Description of DAB Ensemble 1</h1><table>Stuff I don't care about</table>
    <!-- Tags I don't care about -->
    <div id="announcement_data_block">
        <h3>Announcement information</h3>
        <p>No announcement information is broadcast</p>
    </div>
    <!-- More tags I don't care about -->
<h1>Description of DAB Ensemble 2</h1><table>Stuff I don't care about</table>
    <!-- Tags I don't care about -->
    <div id="announcement_data_block">
        <h3>Announcement information</h3>
            <h4>Announcement switching (FIG0/19)</h4>
                <table>Stuff I DO care about</table>
    </div>
    <!-- More tags I don't are about -->

我对“公告切换”表感兴趣,对于给定的 DAB 整体,该表可能存在也可能不存在。我有一个

lxml.hmtl.xpath
表达式如下:

f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table/following-sibling::div[@id="announcement_data_block"]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table'

根据我的理解,这个 XPath 语句是说,对于给定的

ens_idx
值:

从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取接下来的第一个表。

在上面的示例中,DAB Ensemble 1 没有这样的表。 我希望 xpath 在尝试获取 DAB Ensemble 1 的表时返回 None 。但是,xpath 在遇到 h1 标签“DAB Ensemble 2 的描述”时不知道停止,因此它会继续运行,直到找到 DAB Ensemble 2的h4标签。 我正在寻求帮助,以找到一个 xpath 语句,该语句将使 XPath 无条件停止在下一个“DAB Ensemble 的描述”h1 标记处。本质上我希望将该指令修改为:

从根目录开始,找到文本匹配“Description of DAB Ensemble {ens_idx}”的 h1 标签(例如“Description of DAB Ensemble 1”、“Description of DAB Ensemble 2”),然后转到您看到的第一个表。 在上面的示例中,它将是标记为“我不关心的东西”的表。 然后,转到下一个 id 为“announcement_data_block”的 div。 在该 div 中,找到一个 h4 标签,其文本以“公告切换”开头。 获取随后的第一个表。 如果在文本匹配“Description of DAB Ensemble {ens_idx + 1}”或 EOF 的 h1 标记之前找不到此条件,则返回 None。

粗体部分是我的 XPath 表达式中缺少的部分。有谁知道如何构造这样的表达式?

python html xpath lxml
1个回答
0
投票

从示例中可以看出,H1 和带有 id 的 div 都是兄弟姐妹,所以 搜索应表明找到的第一个

following::table
和第一个
@id="announcement_data_block"
是必需的,因为

f'//h1[text()="Description of DAB Ensemble {ens_idx}"]/following-sibling::table[1]/following-sibling::div[@id="announcement_data_block"][1]/h4[starts-with(text(), "Announcement switching")]/following-sibling::table'

顺便说一句:id 不应重复。

© www.soinside.com 2019 - 2024. All rights reserved.