我有一个关于选择标签列表(或单个标签)的问题,该条件使用其子项的某个属性上的条件。具体来说,给定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>
。在上面的示例代码中,它会Player
和X.text
提取<tr>
个标记。任何帮助将不胜感激。
答案 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>