Очистка данных с веб-страницы с использованием JavaScript с использованием Python - PullRequest
0 голосов
/ 25 июня 2019

Я пытаюсь вычеркнуть заголовок веб-страницы. Сначала я попытался использовать BeautifulSoup, но обнаружил, что сама страница не будет загружаться без Javascript. Поэтому я использую некоторый код, который я нашел в Google и который использует библиотеку request-html:

from requests_html import HTMLSession
from bs4 import BeautifulSoup
session = HTMLSession()
resp = session.get("https://www150.statcan.gc.ca/t1/tbl1/en/tv.action?pid=3210001601")
resp.html.render()
soup = BeautifulSoup(resp.html.html, "lxml")

soup.find_all('h1')

Но всегда есть ошибка в строке:

D:\Python\TitleSraping\venv\Scripts\python.exe "D:/Python/TitleSraping/venv/Text Scraping.py"
Traceback (most recent call last):
  File "D:\Python\TitleSraping\venv\lib\site-packages\pyppeteer\execution_context.py", line 106, in evaluateHandle
    'userGesture': True,
pyppeteer.errors.NetworkError: Protocol error (Runtime.callFunctionOn): Cannot find context with specified id

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "D:/Python/TitleSraping/venv/Text Scraping.py", line 5, in <module>
    resp.html.render()
  File "D:\Python\TitleSraping\venv\lib\site-packages\requests_html.py", line 598, in render
    content, result, page = self.session.loop.run_until_complete(self._async_render(url=self.url, script=script, sleep=sleep, wait=wait, content=self.html, reload=reload, scrolldown=scrolldown, timeout=timeout, keep_page=keep_page))
  File "D:\Program Files (x86)\Python\lib\asyncio\base_events.py", line 584, in run_until_complete
    return future.result()
  File "D:\Python\TitleSraping\venv\lib\site-packages\requests_html.py", line 531, in _async_render
    content = await page.content()
  File "D:\Python\TitleSraping\venv\lib\site-packages\pyppeteer\page.py", line 780, in content
    return await frame.content()
  File "D:\Python\TitleSraping\venv\lib\site-packages\pyppeteer\frame_manager.py", line 379, in content
    '''.strip())
  File "D:\Python\TitleSraping\venv\lib\site-packages\pyppeteer\frame_manager.py", line 295, in evaluate
    pageFunction, *args, force_expr=force_expr)
  File "D:\Python\TitleSraping\venv\lib\site-packages\pyppeteer\execution_context.py", line 55, in evaluate
    pageFunction, *args, force_expr=force_expr)
  File "D:\Python\TitleSraping\venv\lib\site-packages\pyppeteer\execution_context.py", line 109, in evaluateHandle
    _rewriteError(e)
  File "D:\Python\TitleSraping\venv\lib\site-packages\pyppeteer\execution_context.py", line 238, in _rewriteError
    raise type(error)(msg)
pyppeteer.errors.NetworkError: Execution context was destroyed, most likely because of a navigation.

Process finished with exit code 1

Кто-нибудь знает, что это значит? Я совершенно новичок в этом, поэтому я прошу прощения, если я использую любую терминологию неправильно.

Ответы [ 4 ]

0 голосов
/ 25 июня 2019

Как сказал Иван, здесь у вас есть полный код: sleep = 1, keep_page = True, сделайте трюк

from requests_html import HTMLSession
from bs4 import BeautifulSoup

session = HTMLSession()
resp = session.get("https://www150.statcan.gc.ca/t1/tbl1/en/tv.action?pid=3210001601")
resp.html.render(sleep=1, keep_page=True)
soup = BeautifulSoup(resp.html.html, "lxml")
print(soup.find_all('title'))

Ответ:

[<title>
    Milled wheat and wheat flour produced</title>]
0 голосов
/ 25 июня 2019

Вам нужно загрузить JS, потому что если вы не загрузите его, HTML-код не загрузится. Вы можете использовать Selenium

0 голосов
/ 25 июня 2019

Попробуйте Селеней.

Seleneum - это библиотека, которая позволяет программам взаимодействовать с веб-страницами, контролируя браузер.

Вот пример в ответ на чужой вопрос.

0 голосов
/ 25 июня 2019

Похоже на ошибку в базовой библиотеке puppeteer, вызванную обработкой некоторого JavaScript. Вот один из обходных путей из https://github.com/kennethreitz/requests-html/issues/251, возможно, это поможет.

resp.html.render(sleep=1, keep_page=True)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...