Как я могу извлечь следующие ссылки из исходного кода HTML в Python? - PullRequest
0 голосов
/ 02 июля 2019

Вот мой небольшой исходный код HTML:

<div class="s">
   <div class="th N3nEGc" style="height:48px;width:61px">
<a href="/imgres?imgurl=https://linuxhint.com/wpcontent/uploads/2018/12/11.jpg&amp;imgrefurl=https://linuxhint.com/setup_screensaver_manjaro_linux/&amp;h=912&amp;w=1140&amp;tbnid=10DzCgmImE0jM&amp;tbnh=201&amp;tbnw=251&amp;usg=K_YJsquLr4rorhW2ks8UdceQ8uKjg=&amp;docid=0vImrzSjsr5zQM"
         data-ved="2ahUKEwj3062g3pDjAhWZQN4KHS-_BL8Q8g0wC3oECAUQBQ"
         ping="/urlsa=t&amp;source=web&amp;rct=j&amp;url=/imgres%3Fimgurl%3Dhttps://linuxhint.com/wpcontent/uploads/2018/12/11.jpg%26imgrefurl%3Dhttps://linuxhint.com/setup_screensaver_manjaro_linux/%26h%3D912%26w%3D1140%26tbnid%3D10DzCgmImE0jM%26tbnh%3D201%26tbnw%3D251%26usg%3DK_YJsquLr4rorhW2ks8UdceQ8uKjg%3D%26docid%3D0vImrzSjsr5zQM&amp;ved=2ahUKEwj3062g3pDjAhWZQN4KHS-_BL8Q8g0wC3oECAUQBQ">
      </a>
   </div>
</div>

Что я хочу извлечь, это ссылка: <a href="/imgres?imgurl=https://linuxhint.com/wpcontent/uploads/2018/12/11.jpg&amp;

так что вывод будет таким,

https://linuxhint.com/wpcontent/uploads/2018/12/11.jpg

То, что я пробовал с помощью python:

 sourceCode = opener.open(googlePath).read().decode('utf-8')
 links = re.findall('href="/imgres?imgurl=(.*?)jpg&amp;imgrefurl="',sourceCode)
 for i in links:
    print(i)

Ответы [ 3 ]

2 голосов
/ 02 июля 2019

Лучше, чем разбирать строку запроса через regex, используя функцию parse_qs (безопаснее, вы получите именно то, что хотите, без regex перебирая) ( doc ):

data = '''<div class="s"><div class="th N3nEGc" style="height:48px;width:61px"><a href="/imgres?imgurl=https://linuxhint.com/wpcontent/uploads/2018/12/11.jpg&amp;imgrefurl=https://linuxhint.com/setup_screensaver_manjaro_linux/&amp;h=912&amp;w=1140&amp;tbnid=10DzCgmImE0jM&amp;tbnh=201&amp;tbnw=251&amp;usg=K_YJsquLr4rorhW2ks8UdceQ8uKjg=&amp;docid=0vImrzSjsr5zQM" data-ved="2ahUKEwj3062g3pDjAhWZQN4KHS-_BL8Q8g0wC3oECAUQBQ" ping="/urlsa=t&amp;source=web&amp;rct=j&amp;url=/imgres%3Fimgurl%3Dhttps://linuxhint.com/wpcontent/uploads/2018/12/11.jpg%26imgrefurl%3Dhttps://linuxhint.com/setup_screensaver_manjaro_linux/%26h%3D912%26w%3D1140%26tbnid%3D10DzCgmImE0jM%26tbnh%3D201%26tbnw%3D251%26usg%3DK_YJsquLr4rorhW2ks8UdceQ8uKjg%3D%26docid%3D0vImrzSjsr5zQM&amp;ved=2ahUKEwj3062g3pDjAhWZQN4KHS-_BL8Q8g0wC3oECAUQBQ">'''

from bs4 import BeautifulSoup
from urllib.parse import urlparse, parse_qs

soup = BeautifulSoup(data, 'lxml')

d = urlparse(soup.select_one('a[href*="imgurl"]')['href'])
q = parse_qs(d.query)

print(q['imgurl'])

Печать:

['https://linuxhint.com/wpcontent/uploads/2018/12/11.jpg']
0 голосов
/ 05 июля 2019

Возможно, вам следует добавить escape-символ для '?', Попробуйте это:

links = re.findall('href="/imgres\?imgurl=(.*?)jpg&amp;imgrefurl="',sourceCode)
for i in links:
    print(i)
0 голосов
/ 02 июля 2019

Если проблема в вашем регулярном выражении, то я думаю, вы можете попробовать это:

link = re.search('^https?:\/\/.*[\r\n]*[^.\\,:;]', sourceCode)
link = link.group()
print (link)
...