Как получить необработанный html с абсолютными путями ссылок при использовании ‘requests-html’

#python #python-3.x #python-requests #python-requests-html

#python #python-3.x #python-запросы #python-requests-html

Вопрос:

При выполнении запроса с использованием requests библиотеки для https://stackoverflow.com

 page = requests.get(url='https://stackoverflow.com')
print(page.content)
 

Я получаю следующее:

 <!DOCTYPE html>
    <html class="html__responsive html__unpinned-leftnav">
    <head>
        <title>Stack Overflow - Where Developers Learn, Share, amp;amp; Build Careers</title>
        <link rel="shortcut icon" href="https://cdn.sstatic.net/Sites/stackoverflow/Img/favicon.ico?v=ec617d715196">
        <link rel="apple-touch-icon" href="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v=c78bd457575a">
        <link rel="image_src" href="https://cdn.sstatic.net/Sites/stackoverflow/Img/apple-touch-icon.png?v=c78bd457575a"> 
..........
 

Этот исходный код здесь имеет абсолютные пути, но при запуске того же URL requests-html -адреса с использованием рендеринга js

 with HTMLSession() as session:
    page = session.get('https://stackoverflow.com')
    page.html.render()
    print(page.content)
 

Я получаю следующее:

 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>StackOverflow.org</title>
<script type="text/javascript" src="lib/jquery.js"></script>
<script type="text/javascript" src="lib/interface.js"></script>
<script type="text/javascript" src="lib/window.js"></script>
<link href="lib/dock.css" rel="stylesheet" type="text/css" />
<link href="lib/window.css" rel="stylesheet" type="text/css" />
<link rel="icon" type="image/gif" href="favicon.gif"/>
..........
 

Ссылки здесь являются относительными путями,

Как я могу получить исходный код с абсолютными путями, например requests , при использовании requests-html с рендерингом js?

Комментарии:

1. Не могли бы вы объяснить, что вы подразумеваете под исходными кодами и параллельным сравнением различий в ответе, который вы получаете от обоих пакетов для конкретной ссылки?

2. исходные коды: необработанный html страницы, коды сравнения приведены в вопросе выше. Когда я использую библиотеку requests-html с рендерингом js для получения необработанного HTML-ответа страницы, в этом исходном коде raw HTML я получаю относительные ссылки в src href атрибутах или, как в requests библиотеке, я получаю полную абсолютную ссылку.

3. Я не могу воспроизвести это в последних версиях. Я вижу один и тот же результат в обоих.

Ответ №1:

Вероятно, это должен быть запрос функции для разработчиков request-html. Однако на данный момент мы можем достичь этого с помощью этого хакерского решения:

 from requests_html import HTMLSession
from lxml import etree

with HTMLSession() as session:
    html = session.get('https://stackoverflow.com').html
    html.render()

    # iterate over all links
    for link in html.pq('a'):
        if "href" in link.attrib:
            # Make links absolute
            link.attrib["href"] = html._make_absolute(link.attrib["href"])

    # Print html with only absolute links
    print(etree.tostring(html.lxml).decode())
 

Мы изменяем html-объекты, лежащие в основе дерева lxml, путем перебора всех ссылок и изменения их местоположения на абсолютное, используя закрытую функцию html-объекта _make_absolute .

Ответ №2:

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

Цитата:

Возьмите список всех ссылок на странице в абсолютной форме (якоря исключены):

 r.html.absolute_links
 

Не могли бы вы попробовать это утверждение?

Комментарии:

1. Мне нужен исходный код, содержащий абсолютные пути, а не только ссылки.

2. Мой плохой, я думаю, что я неправильно понял ваш вопрос.