Python XPath:如何根据直接位于元素前面的同一级别元素的值来选择元素?

Python XPath:如何根据直接位于元素前面的同一级别元素的值来选择元素?,python,html,xpath,Python,Html,Xpath,我使用Python和Xpath从一些html页面提取数据,但遇到了一些问题 考虑以下示例HTML: <tbody> <tr> <th>Author</th> </tr> <tr> <td>Dan Brown</td> </tr> <tr> <th>Genre</th>

我使用Python和Xpath从一些html页面提取数据,但遇到了一些问题

考虑以下示例HTML:

<tbody>
    <tr>
        <th>Author</th>
    </tr>
    <tr>
        <td>Dan Brown</td>
    </tr>
    <tr>
        <th>Genre</th>
    </tr>
    <tr>
        <td>Educational</td>
    </tr>
</tbody>

作者
丹布朗
体裁
教育的
如何选择作者数据或流派数据?我不能使用固定列表位置(例如tr[2]),因为值并不总是存在。例如,如果一本书没有作者,tr[2]会突然成为流派(假设它确实有流派)


我希望我的问题很清楚:)

一个简单的方法是应用以下XPath-1.0表达式:

/tbody/tr[th/text()='Author']/following-sibling::tr/td/text()
选择Dan Brown和

/tbody/tr[th/text()='Genre']/following-sibling::tr/td/text()
选择
教育

如有必要,可以在表达式前面加上
/


这些表达式是否真的符合您的预期结果取决于您(非共享)XML文件的结构。

太快了!它就像一个符咒。非常感谢!好吧,它不像我最初想的那样好用。对我来说,它选择了所有进一步的元素。因此,假设上面的例子,xpath的结果是一个列表[Dan Brown,Educational],用于作者,而对于类型,则是一个只有[Educational]的列表。虽然它是可行的(我可以选择列表中的第一个元素),但我不确定这是否是xpath或我的代码中的其他地方(或我的xpath实现)的问题,尽管可能是后者。不过,还是比我自己想出的好得多哈哈。好吧,我把上面的问题改为
/tbody/tr[th/text()='Author']/following sibling::tr[1]/td/text()
。注意额外的[1]。不确定这是否是一种好的做法,但对我来说很有效。再次感谢!:)我很高兴你找到了解决办法。我还尝试了一些可能性,并提出了一个类似
[1]
的索引。但是如果没有XML,我只能猜测……我知道你已经接受了一个答案,但作为将来的参考:如果,像你的例子中那样,没有作者,
作者
在那里,或者
直接以
类型开始
?是的,就像我(尝试过,但可能不是很好的哈哈)在最后一段中解释的那样,如果没有作者,那么第一个tr将是带有“流派”的tr(在本例中)。所以没有一个作者会少两行表格;所以
/tbody/tr[th/text()='Author']
,在这种情况下,应该是
none
,对吧?是的,我想这是正确的。在这种情况下,你能扩展html示例,在没有作者或流派的情况下再扩展3-4个例子吗?因为在这些情况下,公认的答案可能不起作用。