Я изучаю Python и Beautiful Soup, и в качестве упражнения я создаю тестовую веб-страницу. Моя цель - извлечь URL-адрес с веб-страницы, а затем следовать этому URL-адресу, чтобы извлечь другой URL-адрес.

Мой код:

Первый шаг:

path = "http://python-data.dr-chuck.net/known_by_Fikret.html"
pattern = re.compile(r'"(.+)"')
page = urllib2.urlopen(path)
soup = bs(page, 'lxml')
a = soup.find_all("a")
path = re.search(pattern, str(a[2])).group(0)
path

Вне:

'"http://python-data.dr-chuck.net/known_by_Montgomery.html"'

Второй шаг:

page = urllib2.urlopen(path)
soup = bs(page, 'lxml')
a = soup.find_all("a")
path = re.search(pattern, str(a[2])).group(0)
path

Вне:

---------------------------------------------------------------------------
URLError                                  Traceback (most recent call last)
<ipython-input-33-14ad9508aea0> in <module>()
----> 1 page = urllib2.urlopen(path)
      2 soup = bs(page, 'lxml')
      3 a = soup.find_all("a")
      4 path = re.search(pattern, str(a[2])).group(0)
      5 path

C:\users\alex\Anaconda2\lib\urllib2.pyc in urlopen(url, data, timeout, cafile, capath, cadefault, context)
    152     else:
    153         opener = _opener
--> 154     return opener.open(url, data, timeout)
    155 
    156 def install_opener(opener):

C:\users\alex\Anaconda2\lib\urllib2.pyc in open(self, fullurl, data, timeout)
    427             req = meth(req)
    428 
--> 429         response = self._open(req, data)
    430 
    431         # post-process response

C:\users\alex\Anaconda2\lib\urllib2.pyc in _open(self, req, data)
    450 
    451         return self._call_chain(self.handle_open, 'unknown',
--> 452                                 'unknown_open', req)
    453 
    454     def error(self, proto, *args):

C:\users\alex\Anaconda2\lib\urllib2.pyc in _call_chain(self, chain, kind, meth_name, *args)
    405             func = getattr(handler, meth_name)
    406 
--> 407             result = func(*args)
    408             if result is not None:
    409                 return result

C:\users\alex\Anaconda2\lib\urllib2.pyc in unknown_open(self, req)
   1264     def unknown_open(self, req):
   1265         type = req.get_type()
-> 1266         raise URLError('unknown url type: %s' % type)
   1267 
   1268 def parse_keqv_list(l):

URLError: <urlopen error unknown url type: "http>

Почему урлопен не распознает URL?

Ваш совет будет оценен.

0
im7 13 Янв 2017 в 16:11

4 ответа

Лучший ответ

Используйте .group(1) при получении результата соответствия регулярному выражению. .group(0) возвращает всю совпадающую строку, включая кавычки.

1
Yaroslav Stavnichiy 13 Янв 2017 в 13:22

Ваша проблема в том, что у вас " в URL. Убери это.

Но у BeautifulSoup есть собственные методы для получения URL - a[2]['href']

from bs4 import BeautifulSoup as bs
import urllib2

# - first page -

path = "http://python-data.dr-chuck.net/known_by_Fikret.html"

page = urllib2.urlopen(path)
soup = bs(page, 'lxml')

all_links = soup.find_all("a")

#for link in all_links:
#    print link['href']

print all_links[2]['href']

# - second page -

path = all_links[2]['href']

page = urllib2.urlopen(path)
soup = bs(page, 'lxml')

all_links = soup.find_all("a")

#for link in all_links:
#    print link['href']

print all_links[2]['href']

Или короче

from bs4 import BeautifulSoup as bs
import urllib2

def get_url(path):
    page = urllib2.urlopen(path)
    soup = bs(page, 'lxml')

    all_links = soup.find_all("a")

    #for link in all_links:
    #    print link['href']

    return all_links[2]['href']

# - first page -

path = "http://python-data.dr-chuck.net/known_by_Fikret.html"

path = get_url(path)

print path

# - second page -

path = get_url(path)

print path
1
furas 13 Янв 2017 в 13:26
path.strip('"')

Вне:

'http://python-data.dr-chuck.net/known_by_Montgomery.html'

URL неверный, просто удалите " в URL или настройте регулярное выражение

1
宏杰李 13 Янв 2017 в 13:17

Думаю, проблема в том, что в вас есть дополнительные кавычки path

'"http://python-data.dr-chuck.net/known_by_Montgomery.html"'

Обрежьте строку, используя strip() как

path = path.strip('"')
page = urllib2.urlopen(path)

Вы можете использовать BeautifulSoup, чтобы извлечь источник из тегов привязки. Вам не нужно использовать регулярные выражения для этой цели

< Сильный > Пример

>>> html = """<a href="http://www.google.com">"""
>>> soup.find_all('a')[0]['href']
'http://www.google.com'
2
nu11p01n73R 13 Янв 2017 в 13:17