BeautifulSoup найти текст в определенном теге

С BeautifulSoup я пытаюсь напечатать текст внутри определенного тега, проблема в том, что текст, который я хочу напечатать, находится внутри тега внутри тега <tr>, а на веб-странице есть 30 тегов <tr>. Текст, который мне нужно напечатать, находится во втором теге <td> внутри 19-го вхождения тега <tr>. Это выглядит так:

<tr>...</tr>
<tr>...</tr>
<tr>
    <td class = "QL">Text1</td>
    <td class = "QL">Text2</td>
    <td class = "QL">Text3</td>
</tr>
<tr>...</tr>
<tr>...</tr>

Я хочу напечатать Text2.

Вот моя попытка:

from urllib.request import urlopen
from bs4 import BeautifulSoup
quote_page = 'http://google.com'
page = urlopen(quote_page)
soup = BeautifulSoup(page, 'html.parser')
for link in soup.find("td", {"class": "QL"}):
    print(link)

Как бы то ни было, он печатает первое вхождение тега <td class = "QL">. Как мне заставить его печатать текст внутри 19-го вхождения этого тега и без печати Text1 и Text3?

Вам нужен soup.findAll

zondo 02.05.2018 00:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
1
1 273
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы можете использовать enumerate с find_all:

result = [a.text for i, a in enumerate(soup.find_all("td", {"class": "QL"}), start=1) if i == 19][0]
Ответ принят как подходящий

Поскольку вы знаете точные позиции тегов, которые хотите найти, вы можете использовать find_all(), который возвращает список, а затем получает тег из требуемого индекса.

В этом случае (19-й <tr> и 2-й <td>) используйте это:

result = soup.find_all('tr')[18].find_all('td')[1].text

Спасибо, все заработало. Однако теперь я использую его для получения текста с нескольких страниц, которые в основном структурированы одинаково, но время от времени встречаются страницы, на которых текст находится не в одном месте, и она возвращает ошибку индекса IndexError: list index out of range. Ошибка индекса не позволяет коду продолжать работу, как я могу этого избежать (и вместо этого вернуть пустой результат)?

Jelz 02.05.2018 12:03

Используйте try-except. Если вы не знаете об этой концепции, просто погуглите. вы поймете это лучше.

Keyur Potdar 02.05.2018 12:03

Спасибо, погуглил и успешно реализовал, работает как шарм.

Jelz 02.05.2018 14:33

Может быть это.

result = [ x.text for x in soup.select('tr > td:nth-of-type(2)')]

Другие вопросы по теме