Python LXML / красивый суп, чтобы найти все ссылки на веб-странице - PullRequest
7 голосов
/ 26 мая 2011

Я пишу скрипт для чтения веб-страницы и создания базы данных ссылок, которая соответствует определенным критериям.Прямо сейчас я застрял с lxml и понимаю, как извлечь все <a href> из HTML ...

result = self._openurl(self.mainurl)
content = result.read()
html = lxml.html.fromstring(content)
print lxml.html.find_rel_links(html,'href')

Ответы [ 4 ]

11 голосов
/ 26 мая 2011

Использовать XPath. Что-то вроде (не могу проверить отсюда):

urls = html.xpath('//a/@href')
4 голосов
/ 28 мая 2011

С iterlinks, lxml предоставляет отличную функцию для этой задачи.

Это дает (элемент, атрибут, ссылка, pos) для каждой ссылки [...] в действии, архиве, фоне, цитировании, classid, кодовой базе, данных, атрибутах href, longdesc, profile, src, usemap, dynsrc или lowsrc.

1 голос
/ 16 августа 2011

Я хочу предоставить альтернативное решение на основе lxml.

В решении используется функция, представленная в lxml.cssselect

    import urllib
    import lxml.html
    from lxml.cssselect import CSSSelector
    connection = urllib.urlopen('http://www.yourTargetURL/')
    dom =  lxml.html.fromstring(connection.read())
    selAnchor = CSSSelector('a')
    foundElements = selAnchor(dom)
    print [e.get('href') for e in foundElements]
0 голосов
/ 16 ноября 2018

Вы можете использовать этот метод:

from urllib.parse import urljoin, urlparse
from lxml import html as lh
class Crawler:
     def __init__(self, start_url):
         self.start_url = start_url
         self.base_url = f'{urlparse(self.start_url).scheme}://{urlparse(self.start_url).netloc}'
         self.visited_urls = set()

     def fetch_urls(self, html):
         urls = []
         dom = lh.fromstring(html)
         for href in dom.xpath('//a/@href'):
              url = urljoin(self.base_url, href)
              if url not in self.visited_urls and url.startswith(self.base_url):
                   urls.append(url)
         return urls
...