Python Beautifulsoup - получить текст из span внутри td с определенным тегом - PullRequest
1 голос
/ 08 марта 2019
<td class="generic_td_class" data-test="specific-location">
<span class="generic-span-class">Text I want to extract</span>
</td>

Я пытаюсь извлечь текст диапазона из нескольких мест, используя Python и Beautifulsoup.Я могу успешно получить содержимое диапазона, используя класс, но мне нужно получить несколько значений из разных областей веб-страницы, и единственный уникальный аспект, по которому я могу искать, это data-test = "specific-location" внутритд (которые все уникальны).Как бы я поступил так?

Я пробовал это:

soup.find('td', data-test_="specific-location").text.strip()

Но я получаю следующую ошибку:

SyntaxError: keyword can't be an expression

Любая помощь будет оченьоценили.

Ответы [ 2 ]

3 голосов
/ 08 марта 2019

Мне помогла Как найти теги только с определенными атрибутами - BeautifulSoup

Пара проблем с вашим кодом. Вы ставите одиночный =, если вы хотите проверить, чтобы переменные были равны, вам нужно использовать ==.

Также у вас было подчеркивание после data-test.

Но это должно сработать

soup.find('td', {'data-test':"specific-location"}).text.strip()
2 голосов
/ 08 марта 2019

Используйте более быстрые селекторы атрибутов css, и вы можете передавать через запятую список желаемых значений местоположения для получения нескольких

from bs4 import BeautifulSoup
html = '''
<td class="generic_td_class" data-test="specific-location">
<span class="generic-span-class">Text I want to extract</span>
</td>
<td class="generic_td_class" data-test="specific-location1">
<span class="generic-span-class">Text I want to extract 2</span>
</td>
'''
soup = BeautifulSoup(html, 'lxml')
data = [item.text.strip() for item in soup.select('[data-test="specific-location"],[data-test="specific-location1"]')]
print(data)

Добавить td впереди, если эти атрибуты встречаются в другом месте

data = [item.text.strip() for item in soup.select('td[data-test="specific-location"],td[data-test="specific-location1"]')]

Вы могли бы дополнительно добавить селектор типа диапазона в конец с комбинатором-потомком, чтобы указать дочерние промежутки td, но здесь это кажется излишним.

data = [item.text.strip() for item in soup.select('td[data-test="specific-location"] span,td[data-test="specific-location1"] span')]

Благодаря @facelessuser вы также можете использовать более тонкий

td:is([data-test="specific-location"], [data-test="specific-location1"]) span
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...