Как извлечь URL из гиперссылки в полученном письме? - PullRequest
2 голосов
/ 30 апреля 2020

Я пытаюсь использовать beautifulsoup для извлечения URL из моего электронного письма. Когда я возвращаю необработанные HTML из моего запроса на получение с помощью API Google, это то, что я получаю (я удалил конфиденциальную информацию и заменил ее на «а» и «1»). В середине этого href = 3D ", за которым следует URL, - это URL-адрес, который мне нужен. Он охватывает 2 строки, но когда я копирую и вставляю это (удаляя =), это правильный URL-адрес.

<html><head></head><body><div class=3D"ydp20dc8582yahoo-style-wrap" style=
=3D"font-family:Helvetica Neue, Helvetica, Arial, sans-serif;font-size:13px=
;"><div></div>
        <div><br></div><div><br></div>
       =20
        </div><div id=3D"ydp475be88byahoo_quoted_8442876516" class=3D"ydp47=
5be88byahoo_quoted">
            <div style=3D"font-family:'Helvetica Neue', Helvetica, Arial, s=
ans-serif;font-size:13px;color:#26882a;">
                <div>----- Forwarded Message -----</div>
                <div><b>From:</b> auto-confirm@aaaaaaaaaaaaaaaaaaaaaaa.com =
&lt;auto-confirm@aaaaaaaaaaaaaaaaaaaaaaa.com&gt;</div><div><b>To:</b> "aaaa=
aaaa@yahoo.com" &lt;aaaaaaaa@yahoo.com&gt;</div><div><b>Sent:</b> Thursday,=
 April 23, 2020, 1:39:28 PM CDT</div><div><b>Subject:</b> You chose a Virtu=
aaaaaaaaaaaa!</div><div><br></div>
                <div><div id=3D"ydp475be88byiv6890824975"><div><p> Hello aa=
aaaaaaaaaa, </p><p> Thanks for visiting <a href=3D"https://www.aaaaaaaaaaaa=
aaaaaaaaaaa.com/token/111111111aaaaa11111aaaa111111111" rel=3D"nofollow" ta=
rget=3D"_blank">https://www.aaaaaaaaaaaaaaaaaaaaaaa.com</a>. You recently s=
elected a aaaaaaaaaaaaaaaaaaaaaaaaaaaa. </p><p><a href=3D"https://www.aaaaa=
aaaaaaaaaaaaaaaaaa.com/token/111111111aaaaa11111aaaa111111111" rel=3D"nofol=
low" target=3D"_blank">Click here</a> to aaaaaaaaaaaaaaaaaaaaaaaa details, =
spend history and more. <br>Enjoy aaaaaaaaa!</p><p> https://www.aaaaaaaaaaa=
aaaaaaaaaaaa.com </p><p>Digital token: 1111-111111-1111</p><hr><p>Please do=
n=E2=80=99t reply to this email. If you have questions, please <a href=3D"h=
ttps://www.aaaaaaaaaaaaaaaaaaaaaaaaa.com/ContactUs" rel=3D"nofollow" target=
=3D"_blank"> click here. </a></p></div></div></div>
            </div>
        </div></body></html>

Мне нужно извлечь URL в теге href, который находится в 2 строках. Когда я делаю это элемент Beautifulsoup, кажется, что все теги обрезаются на знак =. Вот что он показывает, когда я назначаю вышеперечисленное красивому супу, а затем распечатываю его.

<html><head></head><body><div arial="" class='3D"ydp20dc1111yahoo-style-wrap"' helvetica="" 
neue="" sans-serif="" style='=3D"font-family:Helvetica'><div></div>
<div><br/></div><div><br/></div>
       =20
        </div><div class='3D"ydp47=' id='3D"ydp47511111yahoo_quoted_8445876516"'>
<div arial="" helvetica="" neue="" s='ans-serif;font-size:13px;color:#26282a;"' 
style="3D&quot;font-family:'Helvetica">
<div>----- Forwarded Message -----</div>
<div><b>From:</b> auto-confirm@aaaaaaaaaaaaaaaaaaaa.com =
&lt;auto-confirm@aaaaaaaaaaaaaaaaaaaaaaa.com&gt;</div><div><b>To:</b> "aaaa=
aaaa@yahoo.com" &lt;aaaaaaaa@yahoo.com&gt;</div><div><b>Sent:</b> Thursday,=
 April 23, 2020, 1:39:28 PM CDT</div><div><b>Subject:</b> You chose a Virtu=
aaaaaaaaaaa!</div><div><br/></div>
<div><div id='3D"ydp475be88byiv6890824975"'><div><p> Hello aa=
aaaaaaaaa, </p><p> Thanks for visiting <a alsolutions.com="" 
href='3D"https://www.aaaaaaaaaaaa=' rel='3D"nofollow"' 
ta='rget=3D"_blank"'>https://www.aaaaaaaaaaaaaaaaaaaaaaaaa.com</a>. You recently s=
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa. </p><p><a href='3D"https://www.aaaaa=' 
aaaaaaaaaaaaaaaaaaa.com="" low="" rel='3D"nofol=' target='3D"_blank"'>Click here</a> to 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa =
aaaaaaaaaaaaaaaaaaaa. <br/>Enjoy aaaaaaaaaaaaa</p><p> https://www.aaaaaaaaaaaaaaa=
aaaaaaaaaaaaaa.com </p><p>Digital token: aaaa-aaaaaa-aaaa</p><hr/><p>Please do=
n=E2=80=99t reply to this email. If you have questions, please <a href='3D"h=' 
rel='3D"nofollow"' target='=3D"_blank"' ttps:=""> click here. </a></p></div></div></div>
</div>
</div></body></html>

Как вы можете видеть, beautifulsoup, похоже, теряет URL, когда его отключает google api. Я не уверен, почему api google нарушает его Это код, который я использую для извлечения html из моего электронного письма.

for item in msg_id:
        message = service.users().messages().get(userId = user_id, id = item, format = 
                  'raw').execute()
        msg_raw = base64.urlsafe_b64decode(message['raw'].encode('ASCII'))
        msg_str = email.message_from_bytes(msg_raw)
        content_types = msg_str.get_content_maintype()
        if content_types == 'multipart':
            part1, part2 = msg_str.get_payload()
            # print(part2.get_payload())
            return part2.get_payload()
        else:
            return msg_str.get_payload()

Любая помощь в том, как изменить мой запрос Google API или запрос Beautifulsoup, будет очень полезна. Спасибо заранее.

РЕДАКТИРОВАТЬ: я сделал то, что предложил @fedeCalendino, и вот вывод. Он все еще разбивает URL на 2 строки с = в середине.

  soup = BeautifulSoup(content)
[<a href="https://www.aaaaaaaaaaaaaaa=
aaaaaaaaaaaaa.com/token/aaaaaaa111111111aaaaaaaaaa11111111" rel="nofollow" 
ta='rget="_blank"'>https://www.aaaaaaaaaaaaaaaaaaaaaaaaaa.com</a>, <a 
href="https://www.aaaaa=    
iddigitalsolutions.com/token/aaaaaaa111111111aaaaaaa1111111" rel="nofol= 
low" target="_blank">Click here</a>, <a href="h=
ttps://www.aaaaaaaaaaaaaaaaaaaaaaaaa.com/ContactUs" rel="nofollow" 
target='="_blank"'> click here. </a>]

1 Ответ

2 голосов
/ 30 апреля 2020

Вы можете начать с очистки содержимого перед тем, как поместить его в bs.

   content = google_api.get_email()
   content = content.replace("=3D", "=")

   soup = BeautifulSoup(content)
   all_as = soup.find_all("a")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...