Я хочу извлечь 3-ю строку из текстового ввода - PullRequest
3 голосов
/ 08 июля 2019

Мне нужно извлечь третью строку текста.

URL = 'https://simonsmith.github.io/github-user-search/#/search?q=benjamn'
browser = webdriver.Chrome()
browser.get(URL)
time.sleep(20)
content = browser.page_source
soup = BeautifulSoup(content)
for link in soup.find_all('a'):
    n=link.get('href')
    n = re.sub(r"\#",'',n)
    print(n)

В этом примере я бы только собрал benjamn из выходных данных и отбросил остальные.

ВЫХОД:

/
https://developer.github.com/v3/
/benjamn
/BenjamNathan
/benjamni
/benjamnnzz
/BenjamnTal
/benjamncresnik
/benjamn1012990
/benjamnsmith
/benjamn77
/BENJAMNDO4FO
/benjamnzzzz
/benjamn25
/benjamnn
/benjamn2
/benjamnwilliams
https://github.com/simonsmith/github-user-search

Ответы [ 4 ]

1 голос
/ 08 июля 2019

Вы можете получить эту ссылку, используя селен, используя xpath и, конечно, не указав жестко закодированный индекс, как показано ниже:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

LINK = 'https://simonsmith.github.io/github-user-search/#/search?q=benjamn'

with webdriver.Chrome() as driver:
    wait = WebDriverWait(driver, 10)
    driver.get(LINK)
    expected_link = wait.until(EC.presence_of_element_located((By.XPATH,"//a[./*[contains(@class,'username')]]")))
    print(expected_link.get_attribute("href"))

Вывод:

https://simonsmith.github.io/github-user-search/#/benjamn
1 голос
/ 08 июля 2019

Вместо этого вы можете улучшить свой селектор и использовать селектор css

если вы используете

li .u-flex

или

[class^=User].u-flex

первое быстрее; Вы получите только 15 ссылок для людей. Если вы затем используете find_element_by_css_selector, вы вернете только первое совпадение.

То есть:

browser.find_element_by_css_selector("li .u-flex").get_attribute("href")

Нет необходимости в BeautifulSoup, но эквивалент:

soup.select_one('li .u-flex')['href']
1 голос
/ 08 июля 2019

Чтобы получить значение benjamn, используйте WebdriverWait и element_to_be_clickable со следующим xpath.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

URL = 'https://simonsmith.github.io/github-user-search/#/search?q=benjamn'
browser = webdriver.Chrome()
browser.get(URL)
element=WebDriverWait(browser, 15).until(EC.element_to_be_clickable((By.XPATH,"(//a[starts-with(@class,'User_')]//p[starts-with(@class,'User_')])[1]")))
print(element.text)

Выходные данные Выведите на консоль:

benjamn


Для печати всех текстовых значений используйте следующий код.

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

URL = 'https://simonsmith.github.io/github-user-search/#/search?q=benjamn'
browser = webdriver.Chrome()
browser.get(URL)
elements=WebDriverWait(browser, 15).until(EC.visibility_of_all_elements_located((By.XPATH,"//a[starts-with(@class,'User_')]//p[starts-with(@class,'User_')]")))

for element in elements:
 print(element.text)

Вывод:

benjamn
BenjamNathan
benjamni
benjamnnzz
BenjamnTal
benjamncresnik
benjamn1012990
benjamnsmith
benjamn77
BENJAMNDO4FO
benjamnzzzz
benjamn25
benjamnn
benjamn2
benjamnwilliams
1 голос
/ 08 июля 2019

Вы писали:

for link in soup.find_all('a'):

Предположим, у вас вместо этого было:

links = list(soup.find_all('a'))
for link in links:

Тогда links[2] будет содержать нужную ссылку.

Эквивалентно, вы можете использовать:

for i, link in enumerate(soup.find_all('a')):

и сосредоточиться на конкретной ссылке, где i == 2.

...