Web Scraping Innerhtml - PullRequest
       24

Web Scraping Innerhtml

0 голосов
/ 04 июля 2019

Я пытаюсь выполнить WebScrape с библиотекой BeautifulSoup Python3 на https://etherscan.io/ для проекта с открытым исходным кодом.В частности, я хочу получить адрес строки txn , который имеет столбец «Кому» «Создание контракта» (т. Е. Внутренний html).

Возьмем, к примеру, строку в эта ссылка с использованием функции проверки элементов Firefox:

<a href="/address/0x65a0cdb8e79ae3e0c54436362206fd0769335234" title="0x65a0cdb8e79ae3e0c54436362206fd0769335234">Contract Creation</a>

Вот некоторый код:

    url = https://etherscan.io/txs?block=8086187
    response = requests.get(url, timeout=5)
    content = BeautifulSoup(response.content, "html.parser")
    page = content.findAll('td', attrs={"span": ""})
    page = ''.join(str(page))
    if(page.find("Contract Creation") != -1):
    ## find tx that matches with contract
    for i in range(len(page)):
            if i+1 != len(page):
            if({LINE AT CURRENT PAGE == "Contract Creation"})
                tx.append(TXN address); break;

Для этой страницы ожидаемый результат должен быть:

0x48a97150373ca517723db6c39eebcda34719e73a9adb975d5912f21c5a9b4971

У меня проблемы с извлечением конкретной информации.На данный момент я просто проверяю, есть ли на странице создание контракта, а затем пытаюсь найти его.Я мог бы жестко закодировать его и проверить строку, которая говорит

if(page[i[ == "c" and page[i+1] == "o" and page[i+2] == "n"...)
  txn.append(page(i-someNumber:page[i-anotherNumber])

, но это неэффективно.

Еще лучше, было бы просто получить адреса контракта, который находится в заголовке,Если я смогу получить конкретную строку <a href>, то я смогу получить адрес контракта: 0x65A0cDb8e79Ae3e0c54436362206fd0769335234

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

С bs4 4.7.1. вы можете использовать nth-of-type и :contains для поиска в 6-м столбце этой строки. Затем используйте :has, чтобы получить родительскую строку, и снова nth-of-type, чтобы получить первое значение столбца, связанное со строкой, то есть txn. URL содержит параметры строки запроса, поэтому вы можете получать больше результатов за раз. Вы можете использовать Session для эффективности повторного использования соединения.

Идея состоит в том, чтобы показать компоненты и структуру для сопоставления и извлечения. Вместо этого вы можете зацикливать список URL, например.


Селекторы CSS:

Диаграмма, поясняющая комбинацию селекторов:

нажмите, чтобы увеличить

enter image description here


Python3:

from bs4 import BeautifulSoup as bs
import requests

results = [] 

with requests.Session() as s:
    for page in range(1,10):
        r = s.get('https://etherscan.io/txs?ps=51&p={}'.format(page))
        soup = bs(r.content, 'lxml')
        txns_current = [item.text for item in soup.select('tr:has(td:nth-of-type(6):contains("Contract Creation")) td:nth-of-type(1)')]
        if txns_current:
            results.append(txns_current)

final = [item for i in results for item in i]

Дополнительное чтение:

Селекторы Css подробно описаны здесь:

Примечание: поддержка :contains и :has с bs4 4.7.1. nth-of-type широко поддерживается.

Вы можете попрактиковаться в селекторах здесь:

0 голосов
/ 04 июля 2019

Вы можете попробовать этот код для печати добавить

import requests
from bs4 import BeautifulSoup

url = 'https://etherscan.io/txs?block=8086187'

soup = BeautifulSoup(requests.get(url).text, 'lxml')

data = []
for tr in soup.select('#ContentPlaceHolder1_mainrow tr'):
    if tr.select('td'):
        data.append([td for td in tr.select('td')])

for row in data:
    if row[5].text.strip() == 'Contract Creation':
        address = row[5].select_one('a[title]')['title']
        print('txt address={}'.format(address))

Это печатает:

txt address=0x65a0cdb8e79ae3e0c54436362206fd0769335234

РЕДАКТИРОВАТЬ: Вы можете выбрать всю строку, которая содержит TD со строкой Contract Creation с этим селектором CSS:

print(soup.select('tr:has(td:contains("Contract Creation"))'))

Это печатает:

[<tr><td><span class="hash-tag text-truncate"><a href="/tx/0x48a97150373ca517723db6c39eebcda34719e73a9adb975d5912f21c5a9b4971">0x48a97150373ca517723db6c39eebcda34719e73a9adb975d5912f21c5a9b4971</a></span></td><td class="d-none d-sm-table-cell"><a href="/block/8086187">8086187</a></td><td><span title="Jul-04-2019 05:28:46 PM">1 hr 19 mins ago</span></td><td><span class="hash-tag text-truncate"><a href="/address/0x0031e147a79c45f24319dc02ca860cb6142fcba1">0x0031e147a79c45f24319dc02ca860cb6142fcba1</a></span></td><td class="text-center"><span class="btn btn-xs btn-icon btn-soft-success rounded-circle"><i class="fas fa-long-arrow-alt-right btn-icon__inner"></i></span></td><td><i class="far fa-newspaper text-secondary"></i> <a href="/address/0x65a0cdb8e79ae3e0c54436362206fd0769335234" title="0x65a0cdb8e79ae3e0c54436362206fd0769335234">Contract Creation</a></td><td>0 Ether</td><td><span class="small text-secondary">0<b>.</b>00104386</span></td></tr>]
...