#python #web-scraping #beautifulsoup
Вопрос:
Я пытаюсь ухватиться за связь внутри td. Мой код не отображает ссылку и не выдает желаемый результат. Что мне нужно изменить.
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
from time import sleep
import requests
headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0"}
urllink = "https://bscscan.com/txs?block=11711353amp;ps=100amp;p=1"
reqblockdetails = requests.get(urllink, headers=headers, timeout=5)
soupblockdetails = BeautifulSoup(reqblockdetails.content, 'html.parser')
rowsblockdetails = soupblockdetails.findAll('table')[0].findAll('tr')
sleep(1)
for row in rowsblockdetails[1:]:
txnhash = row.find_all('td')[1].text[0:]
txnhashdetails = txnhash.strip()
destination = row.find_all('td')[8].text[0:]
destination = destination.strip()
if str(destination) == "CoinOne: CONE Token":
urldest = soupblockdetails.find('a', attrs={'class': 'hash-tag text-truncate'}).text
print (" {:>1} {:<5}".format(txnhashdetails, destination))
print (urldest)
else:
pass
Текущий вывод:
0x8265a6ba5ce531df645b883e8735af57241f43e92eb3c9a88f43b89310f964bc CoinOne: CONE Token Validator: Stake2me
Необходимый результат:
0x8265a6ba5ce531df645b883e8735af57241f43e92eb3c9a88f43b89310f964bc CoinOne: CONE Token 0x9628735017f1a985ebaac0b203efb9e8d3ed0fef
Ответ №1:
Было бы лучше искать <a>
элемент в текущем выбранном <td>
, но не во всем документе, поэтому я изменил код на td = row.find_all('td')[8]
и позже на td.find('a', ...)
.
Вот рабочий код:
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
from time import sleep
import requests
headers = {"User-Agent": "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:92.0) Gecko/20100101 Firefox/92.0"}
urllink = "https://bscscan.com/txs?block=11711353amp;ps=100amp;p=1"
reqblockdetails = requests.get(urllink, headers=headers, timeout=5)
soupblockdetails = BeautifulSoup(reqblockdetails.content, 'html.parser')
rowsblockdetails = soupblockdetails.findAll('table')[0].findAll('tr')
sleep(1)
for row in rowsblockdetails[1:]:
txnhash = row.find_all('td')[1].text[0:]
txnhashdetails = txnhash.strip()
td = row.find_all('td')[8]
destination = td.text[0:].strip()
if str(destination) == "CoinOne: CONE Token":
urldest = td.find('a', attrs={'class': 'hash-tag text-truncate'})["href"].lstrip("/address/")
print (" {:>1} {:<5}".format(txnhashdetails, destination))
print (urldest)
else:
pass
Комментарии:
1. Да, спасибо вам за это,
2. Я попытался установить эту часть -> if str (destination)== «Создание контракта»: и получать ошибки. Что может быть не так?
3. Сейчас это не работает, потому что похоже, что не каждый
<a>
тег содержитhash-tag text-truncate
классы, поэтому вы можете удалитьattrs={'class': 'hash-tag text-truncate'}
4. Я вижу. Теперь это работает. Спасибо
Ответ №2:
Надеюсь, это сработает. попробуйте это:
t_link = soupblockdetails.find('span', attrs={'class': 'hash-tag text-truncate'})
urldest = t_link.a['href']
Комментарии:
1. Спасибо, но, похоже, результат неверен.. Я ожидаю увидеть ссылку: bscscan.com/address/0x9628735017f1a985ebaac0b203efb9e8d3ed0fef или 0x9628735017f1a985ebaac0b203efb9e8d3ed0fef