0

помогите, пожалуйста, получить чистый текст без тегов. Никогда не занимался парсингом. пытался это реализовать вот таким образом, получаю на выходе только лишь теги

url = "https://en.wikipedia.org/wiki/Java_(programming_language)"
p = Popen(["curl", '-k', url], stdin=PIPE, stdout=PIPE)
text, err = p.communicate()
out = str(text, 'utf-8', 'ignore')
print(out)
jfs
  • 52,361

2 Answers2

1

Чтобы получить содержимое Wikipedia страницы без разметки, можно использовать MediaWiki API:

$ curl 'https://en.wikipedia.org/w/api.php?format=json&action=query&prop=extracts&explaintext&titles=Java_%28programming_language%29' | 
  jq -r '.. | .extract? | select(. != null)'

Basic jq usage. How to get nested value.

На Питоне:

#!/usr/bin/env python3
import json
from urllib.parse import quote as urlquote
from urllib.request import urlopen

title = 'Java (programming language)'
url = ("https://en.wikipedia.org/w/api.php"
       "?format=json&action=query&prop=extracts&explaintext"
       "&titles=" + urlquote(title))
with urlopen(url) as response:
    data = json.loads(response.read().decode())
    for page in data['query']['pages'].values():
        print(page['extract'])

Если есть желание вызвать curl команду прямо из Питона:

import subprocess

json_text = subprocess.check_output(['curl', url], encoding='utf-8')

См. Перенаправление вывода терминала в переменную. Можно pycurl библиотеку использовать: пример.

В более общем случае, если нет у сайта явного или неявного (подсмотренного) API, то curl, который может только вернуть ответ http-сервера, не сможет текст без html разметки вернуть. curl команда это не браузер и в частности не является html-парсером или javascript интерпретатором. То есть curl никак не поможет, если содержимое генерируется на лету в javascript или с разбором полученной html разметки. В этом другие инструменты могут помочь: Как парсить html страничку с JavaScript в python 3?

Наивные regex могут легко сломаться при разборе html: Is ">" (U+003E GREATER-THAN SIGN) allowed inside an html-element attribute value?

Удобно текст из html выбрать, используя beautifulsoup4:

import bs4  # $ pip install beautifulsoup4

soup = bs4.BeautifulSoup(html, 'html.parser')
print(soup.get_text())

В реальных примерах, стоит исключить содержимое <script>, <style> элементов. Есть специализированные инструменты для чистки html, к примеру, lxml.html.clean.

Стоит различать удаление всей разметки из html документа и получение текста, который можно безопасно вставить в другой html документ.

jfs
  • 52,361
0

Попробуйте так:

import os
req = os.popen("curl 'https://en.wikipedia.org/wiki/Java_(programming_language)' | sed 's/<\/*[^>]*>//g' ").read()
print(req)
Vladimir
  • 279
  • 1
  • 8
  • Спасибо за отклик. Попробовал. Вывод такой: The specified path is invalid. – Fractal Apr 09 '18 at 18:25
  • только что попробовал еще раз, работает: – Vladimir Apr 09 '18 at 18:54
  • сейчас допишу вывод – Vladimir Apr 09 '18 at 18:55
  • `>>> import os

    req = os.popen("curl 'https://en.wikipedia.org/wiki/Java_(programming_language)' | sed 's/</[^>]>//g' ").read()

    % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 289k 100 289k 0 0 312k 0 --:--:-- --:--:-- --:--:-- 312k

    req

    '\n\n\n\nJava (programming language) - Wikipedia `

    – Vladimir Apr 09 '18 at 18:56
  • нет нужды regex для разбора html использовать (это не будет работать в общем случае, а в частном случае можно попросить нужное содержимое через API вернуть). – jfs Apr 10 '18 at 08:26