Как захватить некоторую часть ссылки внутри тега td в python

#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