获取特定行的内容

时间:2019-05-31 06:51:28

标签: python html web web-scraping

我想在文本为“ 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 地址 电话号码

4 个答案:

答案 0 :(得分:1)

使用bs4 4.7.1组合:has:contains的伪类以检索其中的行和tds。

如果该标签的文本出现了,则该位定位到正确的a标签

a:contains("xyz")

然后,您检索具有此tr标签的父行(a

tr:has(a:contains("xyz"))

最后使用descendant combinatortd 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/