根据漂亮汤中儿童的文本值查找标签列表

2024-10-01 13:24:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于使用一个条件来选择一个标记列表(或单个标记)的问题。具体来说,给定HTML代码:

<tbody>
<tr class="" data-row="0">
<tr class="" data-row="1">
<tr class="" data-row="2">
    <td align="right" csk="13">13</td>
    <td align="left" csk="Jones,Andre"><a href="/players/andre-jones-2.html">Andre Jones</a>       
    </td>
<tr class="" data-row="3">
    <td align="right" csk="7">7</td>
    <td align="left" csk="Jones,DeAndre"><a href="/players/deandre-jones-1.html">DeAndre Jones</a>
    </td>
 <tr class="" data-row="4">
 <tr class="" data-row="5">

我有一个来自外部循环的unicode变量,我试图查看表中的每一行,以提取带有Player==Table.tr.a.text<tr>标记,并在{}中标识重复的玩家名称。因此,例如,如果有多个播放器具有Player=Andre JonesMyRow对象返回包含该播放器名称的所有<tr>标记,而如果只有一行具有Player=Andre Jones,则{}只包含单个元素<tr>,锚文本属性等于Andre Jones。我一直在尝试

^{pr2}$

但这将为MyRow返回[]。如果我使用

MyRow = Table.find_all(lambda X: X.name=='tr' and Player in X.text)

这将选择具有Player作为X.text子字符串的任何{}。在上面的示例代码中,它提取了带有eTable.tr.td.a.text=='Andre Jones'Table.tr.td.a.text=='DeAndre Jones'<tr>标记。任何帮助都将不胜感激。在


Tags: text标记datatabletrclasstdrow
2条回答

无论你想要什么。:)

解决方案1

逻辑:找到第一个标记,其标记名为tr,并在该标记的文本中包含“FooName”,包括其子标记。在

# Exact Match  (text is unicode, turn into str)
print Table.find(lambda tag: tag.name=='tr' and 'FooName' == tag.text.encode('utf-8'))
# Fuzzy Match
# print Table.find(lambda tag: tag.name=='tr' and 'FooName' in tag.text)

输出:

^{pr2}$

解决方案2

逻辑:找到其文本包含FooName的元素,在本例中是anchor标记。然后在树上搜索标记名为tr的所有父代(包括祖先)

# Exact Match
print Table.find(text='FooName').find_parent('tr')
# Fuzzy Match
# import re
# print Table.find(text=re.compile('FooName')).find_parent('tr')

输出

^{pr2}$

使用XPath和lxml可以很容易地做到这一点:

import lxml.html

root = lxml.html.fromstring('''...''')
td = root.xpath('//tr[.//a[text() = "FooName"]]')

美丽组“等价物”应该是:

^{pr2}$

或者如果你回头想想:

td = soup.find('a', text='FooName').find_parent('tr')

相关问题 更多 >