我想在文本为“ xyz”的地方找到“ td”,以便在行中找到其他属性。我只有“ xyz”,并且想在该行中获取其他元素。
.
.
.
<tr>
<td>
<a>xyz</a>
</td>
<td>address</td>
<td>phone number</td>
</tr>
.
.
.
我可以通过使用轻松获得“ xyz” 必需= soup.find('a',text ='xyz') 打印(必填[0] .text)
但是我无法找到'td',因此我可以使用find_next_siblings()获取其他列。
预期输出: y 地址 电话号码
答案 0 :(得分:1)
使用bs4 4.7.1组合:has
和:contains
的伪类以检索其中的行和tds。
如果该标签的文本出现了,则该位定位到正确的a
标签
a:contains("xyz")
然后,您检索具有此tr
标签的父行(a
)
tr:has(a:contains("xyz"))
最后使用descendant combinator和td
type selector获取该行中的所有td
。使用列表推导来返回列表。
from bs4 import BeautifulSoup as bs
html = '''
<tr>
<td>
<a>xyz</a>
</td>
<td>address</td>
<td>phone number</td>
</tr>
'''
soup = bs(html, 'lxml')
items = [item.text.strip() for item in soup.select('tr:has(a:contains("xyz")) td')]
print(items)
答案 1 :(得分:0)
用以下代码替换代码:
from bs4 import BeautifulSoup
html = '''<tr>
<td>
<a>xyz</a>
</td>
<td>address</td>
<td>phone number</td>
</tr>'''
soup = BeautifulSoup(html, 'lxml')
required = soup.find('a', text = 'xyz')
print(required.text)
td = required.parent
siblingsArray = td.find_next_siblings()
for siblings in siblingsArray:
print(siblings.text)
O / P:
xyz
address
phone number
parent
是获取直接父标记,而find_next_siblings
返回下一个兄弟标记的列表。
答案 2 :(得分:0)
如果您拥有现代的BeautifulSoup,则可以使用CSS选择器:contains
。然后使用find_parent()
方法返回。
from bs4 import BeautifulSoup
s = '''
<tr>
<td>Other1</td>
<td>Other1</td>
<td>Other1</td>
</tr>
<tr>
<td>
<a>xyz</a>
</td>
<td>address</td>
<td>phone number</td>
</tr>'''
soup = BeautifulSoup(s, 'lxml')
for td in soup.select_one('a:contains(xyz)').find_parent('tr').select('td'):
print(td.text.strip())
打印:
xyz
address
phone number
答案 3 :(得分:0)
您可以使用xpath。 find_elements_by_xpath()。
https://www.softwaretestingmaterial.com/how-to-locate-element-by-xpath-locator/