查找基于美丽汤中儿童文本值的标签列表

时间:2013-11-25 05:27:26

标签: python python-2.7 beautifulsoup

我有一个关于选择标签列表(或单个标签)的问题,该条件使用其子项的某个属性上的条件。具体来说,给定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变量,我试图查看表中的每一行,用<tr>提取Player==Table.tr.a.text标签,并在{{1}中识别重复的玩家名称}}。因此,例如,如果有多个Table的玩家,Player=Andre Jones对象会返回包含该玩家名称的所有MyRow个标记,而如果只有一行{{1}然后<tr>只包含单个元素Player=Andre Jones,其锚文本属性等于MyRow。我一直在尝试像

这样的事情
<tr>

但是这会为Andre Jones返回Table = soup.find('tbody') MyRow = Table.find_all(lambda X: X.name=='tr' and Player == X.text) 。如果我使用

[]

这将选择MyRow作为MyRow = Table.find_all(lambda X: X.name=='tr' and Player in X.text) 子字符串的<tr>。在上面的示例代码中,它会PlayerX.text提取<tr>个标记。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:3)

您可以使用XPath和lxml轻松完成此操作:

import lxml.html

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

BeautifulSoup“等效”将类似于:

rows = soup.find('tbody').find_all('tr')
td = next(row for row in rows if row.find('a', text='FooName'))

或者如果你反思它:

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

答案 1 :(得分:1)

无论你想要什么。 :)

解决方法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)

输出:

<tr class="" data-row="2">
<td align="right" csk="3">3</td>
<td align="left" csk="Wentz,Parker">
<a href="/players/Foo-Name-1.html">FooName</a>
</td>
</tr>

溶液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')

输出

<tr class="" data-row="2">
<td align="right" csk="3">3</td>
<td align="left" csk="Wentz,Parker">
<a href="/players/Foo-Name-1.html">FooName</a>
</td>
</tr>