Пытаюсь получить формат, который предоставляет page_source из Selenium, но с запросами

#html #selenium-webdriver #beautifulsoup #python-requests

#HTML #selenium-webdriver #beautifulsoup #python-запросы

Вопрос:

Я пытаюсь извлечь электронное письмо из моего репозитория git, найденного здесь:

https://github.com/kyleschiess/Apex/commit/a32f5d426c8c51e41b891b0d35aa860f23c5b11b.patch

Решение с помощью Selenium работает отлично, где:

 soup = BeautifulSoup(driver.page_source, 'lxml')
y = soup.find('pre')
text = y.text
email = re.findall(r'<(. ?)>',text)
email[0]
  

Дает мне ‘38440047 kyleschiess@users.noreply.github.com ‘

Это потому, что y.text не удаляет электронное письмо, которое находится между ‘<‘ и ‘>’.

Selenium выдает мне проблемы с таймаутом, поэтому я бы предпочел использовать запросы.

Теперь, с запросами, когда я делаю:

 r = requests.get(patchURL)
soup = BeautifulSoup(r.text,'lxml')
y = soup.find('p') #different format for some reason
text = y.text
email = re.findall(r'<(. ?)>',text)
email[0]
  

Я получаю ‘2!’.

Я обнаружил, что с запросами преобразование soup в текст удаляет все между ‘<‘ и ‘>’.

В Selenium все, что не является тегом HTML, который находится между ‘<‘ и ‘>’, помещается между ‘<‘ и ‘amp; >’ … So .text не удалит электронное письмо.

Что я могу сделать, чтобы получить электронное письмо с помощью запросов или urllib или чего-либо еще?

Ответ №1:

Я думаю, это то, что вы ищете:

 import requests
import re
url = "https://github.com/kyleschiess/Apex/commit/a32f5d426c8c51e41b891b0d35aa860f23c5b11b.patch"

text = requests.get(url).text
email = re.findall(r'<(. ?)>',text)[0]

print(email)
  

Вывод:

 38440047 kyleschiess@users.noreply.github.com
  

Кроме того, я рассчитал время, и хотя время будет варьироваться в зависимости от скорости вашего интернет-соединения, электронное письмо извлекается примерно за треть секунды:

 import requests
import re
import time

start = time.time()
url = "https://github.com/kyleschiess/Apex/commit/a32f5d426c8c51e41b891b0d35aa860f23c5b11b.patch"

text = requests.get(url).text
email = re.findall(r'<(. ?)>',text)[0]

print(email)
print(time.time() - start)
  

Вывод:

 38440047 kyleschiess@users.noreply.github.com
0.28287720680236816
  

Поскольку веб-сайт не является HTML (на самом деле это просто обычный текст, насколько я могу судить), нет смысла использовать BeautifulSoup. Чтобы получить текст веб-сайта, все, что необходимо, это запустить requests.get(url).text , затем, чтобы получить электронное письмо, вам просто нужно отфильтровать текст с помощью регулярного выражения.