С 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?
Вы можете использовать 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
. Ошибка индекса не позволяет коду продолжать работу, как я могу этого избежать (и вместо этого вернуть пустой результат)?
Используйте try-except
. Если вы не знаете об этой концепции, просто погуглите. вы поймете это лучше.
Спасибо, погуглил и успешно реализовал, работает как шарм.
Может быть это.
result = [ x.text for x in soup.select('tr > td:nth-of-type(2)')]
Вам нужен
soup.findAll