Получить содержимое определенной строки - PullRequest
1 голос
/ 31 мая 2019

Я хочу найти 'td', где текст 'xyz', чтобы я мог найти другие атрибуты в строке.У меня есть только 'xyz' и я хочу получить другие элементы в этой строке.

.
.
.

<tr>
    <td>
        <a>xyz</a>
    </td>
    <td>address</td>
    <td>phone number</td>
</tr>

.
.
.

Я могу легко получить 'xyz', используя required = soup.find ('a', text = 'xyz') print (обязательно [0] .text)

, но я не могу найти' td ', чтобы я мог использовать find_next_siblings () для получения других столбцов.

Ожидаемый результат:адрес xyz номер телефона

Ответы [ 4 ]

1 голос
/ 31 мая 2019

С помощью bs4 4.7.1 объедините псевдоклассы :has и :contains, чтобы получить строку и tds внутри.

Этот бит нацелен на правильный тег a, если присутствует в его тексте

a:contains("xyz")

Затем вы получаете родительскую строку (tr), имеющую этот тег a

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

И, наконец, используйте комбинатор потомков и td селектор типа , чтобы получить все 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)
0 голосов
/ 31 мая 2019

Вы можете использовать xpath. find_elements_by_xpath ().

https://www.softwaretestingmaterial.com/how-to-locate-element-by-xpath-locator/
0 голосов
/ 31 мая 2019

Если у вас есть современный 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
0 голосов
/ 31 мая 2019

Замените ваш код следующим:

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 вернуть список следующего тега братьев и сестер.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...