Как вернуть всю строку, где совпадение строки найдено на веб-странице, используя запрос python

avatar
rbutrnz
9 августа 2021 в 01:18
220
2
1

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

import requests
url = "https://bscscan.com/address/0x88c20beda907dbc60c56b71b102a133c1b29b053#code"
queries = ["Website", "Telegram", "Submitted"]

r = requests.get(url)
for q in queries:
    q = q.lower()
    if q in r.text.lower():
        print(q, 'Found')
    else:
        print(q, 'Not Found')

Текущий вывод:

    website Found
    telegram Found
    submitted Found

Требуемый результат:

    Submitted Found - *Submitted for verification at BscScan.com on 2021-08-08
    Website Found - *Website: www.shibuttinu.com
    Telegram Found - *Telegram: https://t.me/Shibuttinu
Источник

Ответы (2)

avatar
Jack Fleeting
9 августа 2021 в 02:01
1

requests возвращает html-страницу, которую вы должны проанализировать с помощью анализатора html. Одна из проблем заключается в том, что ваши целевые выходные данные застревают в середине длинной строки, которую после синтаксического анализа необходимо извлечь с помощью некоторых манипуляций со строками.

Вы можете проанализировать html с помощью BeautifulSoup с селекторами CSS или lxml с помощью xpath:

Во-первых, используя lxml:

import lxml.html as lh

doc = lh.fromstring(r.text)

loc = doc.xpath('//pre[@class="js-sourcecopyarea editor"]')[0]
targets = list(loc.itertext())[0].split('*')
for target in targets:
    for query in queries:
           if query in target:
                print(target)

С красивым супом:

from bs4 import BeautifulSoup as bs

soup = bs(r.text,'lxml')

pre = soup.select_one('pre.js-sourcecopyarea.editor')
ss = (list(pre.stripped_strings)[0]).split('*')
for s in ss:
       for query in queries:
            if query in s:
                print(s)

Вывод в любом случае:

Submitted for verification at BscScan.com on 2021-08-08

Website: www.shibuttinu.com
 
Telegram: https://t.me/Shibuttinu
rbutrnz
9 августа 2021 в 02:59
0

очень хорошее объяснение. Я предпочитаю тот, что с красивым супом.

rbutrnz
9 августа 2021 в 21:21
0

Еще одно редактирование, с которым мне нужна помощь. Как насчет того, чтобы вместо этого вернуть только всю совпавшую строку? Например, я буду искать соответствие ["t.me", "www"] и вернет t.me/Shibuttinu и www.shibuttinu.com.

avatar
Andre Goulart
9 августа 2021 в 02:10
0

Вы печатаете только q. Что вы запрашиваете. Вы хотите распечатать запрос r

Короче говоря, вы должны попробовать: print(q, 'Found', r)

import requests
url = "https://bscscan.com/address/0x88c20beda907dbc60c56b71b102a133c1b29b053#code"
queries = ["Website", "Telegram", "Submitted"]

req = requests.get(url).text

for r in req:
    if any(q.lower() in r.lower() for q in queries):
        print(q, 'Found in', r)

Наконец, на этом веб-сайте вы не найдете никаких результатов, потому что текст, который вы ищете, не находится внутри текстового тега. Вы, вероятно, захотите отфильтровать свой запрос, ища div с class="ace_line_group".