Функция поиска Beautifulsoup возвращает «-» при получении текста - PullRequest
0 голосов
/ 02 ноября 2019

Я пытаюсь получить текстовое значение внутри тега span, имеющего атрибут id, используя beautifulsoup. Но это не повторяет текст, а только «-».

Я попытался выполнить очистку с помощью тега div с атрибутом class, а затем перейти к тегу span с помощью функции findChildren (), но он по-прежнему возвращает «-». Вот HTML, который я пытаюсь вычистить с сайта https://etherscan.io/tokens-nft.

<div class="row align-items-center">
<div class="col-md-4 mb-1 mb-md-0">Transfers:</div>
<div class="col-md-8"></div>
<span id="totaltxns">266,765</span><hr class="hr-space">
</div>

А вот мой код Python:

from urllib2 import Request,urlopen 
from bs4 import BeautifulSoup as soup
import array 

url = 'https://etherscan.io/tokens-nft'
response = Request(url, headers = {'User-Agent':'Mozilla/5.0'})
page_html = urlopen(response).read()
page_soup = soup (page_html,'html.parser')
count = 0
total_nfts = 2691 #Hard-coded value
supply = []
totalAddr = []
transCount = []
row = []
print('All non-fungible tokens in order of Transfers')

for nfts in page_soup.find_all("a", class_ ='text-primary'):
    link = nfts.get('href')
    new_url = "https://etherscan.io/"+link
    name = nfts.text
    print('NFT '+name)

    response2 = Request(new_url, headers = {'User-Agent':'Mozilla/5.0'})
    phtml = urlopen(response2).read()
    psoup = soup (phtml,'html.parser')

    #Get tags 
    tags = []
    #print('Tags')
    for allTags in psoup.find_all("a",class_ = 'u-label u-label--xs u-label--secondary'):
        tags.append(allTags.text.encode("ascii"))
    count+=1
    if(len(tags)!=0):
        print(tags)


    #Get total supply
    ts = psoup.find("span", class_ = "hash-tag text-truncate")   
    ts = ts.text
    #print(ts)

    #Get holders
    holders = psoup.find("div", {"id":"ContentPlaceHolder1_tr_tokenHolders"}) 
    holders = holders.findChildren()[1].findChildren()[1].text
    #print(holders)

    #Get transfers/transactions
    print(psoup.find("span", attrs={"id":"totaltxns"}).text)

print('Total number of NFTS '+str(count))

Я также пробовал:

transfers = psoup.find("span", attrs={"id":"totaltxns"})

, но это тоже не работает.

Правильный синтаксический анализ должен вернуть 266 765.

1 Ответ

2 голосов
/ 02 ноября 2019

Чтобы найти элемент по id, вы можете использовать soup.find(id='your_id').

Попробуйте это:

from bs4 import BeautifulSoup as bs

html = '''
<div class="row align-items-center">
<div class="col-md-4 mb-1 mb-md-0">Transfers:</div>
<div class="col-md-8"></div>
<span id="totaltxns">266,765</span><hr class="hr-space">
</div>
'''

soup = bs(html, 'html.parser')

print(soup.find(id='totaltxns').text)

Выходы:

266,765

Если выпосмотрите на источник страницы для ссылки, которую вы упомянули, значение в totaltxns равно -. Вот почему он возвращается -.

enter image description here

Значение может быть просто заполнено некоторым кодом JavaScript на странице.


ОБНОВЛЕНИЕ

urlopen().read() просто возвращает исходный источник страницы, полученный от сервера, без каких-либо дальнейших изменений на стороне клиента.

ВыВы можете достичь желаемого результата, используя Selenium + Chrome WebDriver. Идея состоит в том, что мы позволяем javascript на странице работать и анализировать окончательный источник страницы.

Попробуйте это:

from bs4 import BeautifulSoup as bs
from selenium.webdriver import Chrome # pip install selenium
from selenium.webdriver.chrome.options import Options

url='https://etherscan.io/token/0x629cdec6acc980ebeebea9e5003bcd44db9fc5ce'

#Make it headless i.e. run in backgroud without opening chrome window
chrome_options = Options()  
chrome_options.add_argument("--headless")

# use Chrome to get page with javascript generated content
with Chrome(executable_path="./chromedriver", options=chrome_options) as browser:
     browser.get(url)
     page_source = browser.page_source

#Parse the final page source
soup = bs(page_source, 'html.parser')

print(soup.find(id='totaltxns').text)

Выходы:

995,632

Подробнее о настройкепример вебдрайвера + находится в другом вопросе StackOverflow здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...