Автор Тема: Здравейте, имам следният проблем с прочитането на един текстов файл.  (Прочетена 783 пъти)

makeme

  • Напреднали
  • *****
  • Публикации: 726
  • Distribution: Many
  • Window Manager: Mate
    • Профил
Колега грешката е моя извинявам се аз го чета от другият файл но си мислех че ще работи с подобен файл.

Ще работи с всичко подобно на това , което си дал. Проблемът при домейните е , че те са имена. Сиреч текст, който за да го манипулираш, трябва да знаеш първоначалния текст. Може да са http, може и да не са. Може да са със subdomain "www." , може и да са просто с обикновен subdomain "primer.prime.com" . Отделно като добавиш че и топ левел домейни са изградени като субдомейни  "co.uk" , "com.br" и тнт, става невъзможно да изкараш предвидимо нещо.

пп: За нещо по сложно ти трябва база данни за сравнение, което не вярвам да ти е целта.
« Последна редакция: Oct 08, 2019, 22:00 от makeme »
Активен

Distributions:  UbuntuMate 14.04; 15.10; 16.04, CentOS 6.x, 7.x, Kali 2.0 ...

supportpc

  • Напреднали
  • *****
  • Публикации: 99
    • Профил
има ли вариант да с енаправи независимо от файла само да изкарва домейните тоест файла ще бъде конвертиран от pdf на Текстов файл
Активен

supportpc

  • Напреднали
  • *****
  • Публикации: 99
    • Профил
Активен

makeme

  • Напреднали
  • *****
  • Публикации: 726
  • Distribution: Many
  • Window Manager: Mate
    • Профил
има ли вариант да с енаправи независимо от файла само да изкарва домейните тоест файла ще бъде конвертиран от pdf на Текстов файл

Виж сега, ние работим с текст така или иначе. Не вярвам това да ти е проблема. От къде си го взел или формата не е от значение. Ти накрая си обработваш тхт-то. Отварям една скоба разбира се- (енкодинга при извличането не трябва да го е напълнил с джибриш това тхт). Ако това се е случило - проблемът ти е в извличането на текста, а не в рязането му.

И пак да кажа - рязането ще е такова, каквото искаш, само ако текста е подобен на това , което си ни дал. Ако забелязваш там има и поддомейн (en.utrader.com {не е TLD}) и за изкарването само на TLD-а ще е много сложен скрипт с някаква база на какво може да завършва.
Активен

Distributions:  UbuntuMate 14.04; 15.10; 16.04, CentOS 6.x, 7.x, Kali 2.0 ...

supportpc

  • Напреднали
  • *****
  • Публикации: 99
    • Профил
ами добре ще го мисля тогава как да стане
Активен

makeme

  • Напреднали
  • *****
  • Публикации: 726
  • Distribution: Many
  • Window Manager: Mate
    • Профил
Колега грешката е моя извинявам се аз го чета от другият файл но си мислех че ще работи с подобен файл.
Ей ти го проблема:

Цитат
$ docx2txt 1.docx - | awk -F "//" '{ print  $2 }'  | awk -F "/" '{ print  $1 }' | sed 's/www.//1' | grep -v -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | sort -u

aba.marketing
brokerz.com
crypto.com
en.utrader.com
finarix.com
fsc.bg
fxnobels.io
investingcapital.com
jpm-invest.com
pbncapital.com
royalcbank.com
sternmarkets.com
swissinv24.com
trader.online
umarkets.com

Виж например тоя няма хттп


Код
GeSHi (Bash):
  1. $ docx2txt 1.docx - | grep "olssoncapital.com"
  2. www.olssoncapital.com
  3. www.olssoncapital.com


 Като го пейстнеш туk обаче има и ние копираме. Отделно първото което гледаш е слашовете след http.
« Последна редакция: Oct 08, 2019, 22:28 от makeme »
Активен

Distributions:  UbuntuMate 14.04; 15.10; 16.04, CentOS 6.x, 7.x, Kali 2.0 ...

makeme

  • Напреднали
  • *****
  • Публикации: 726
  • Distribution: Many
  • Window Manager: Mate
    • Профил
Ето ти и за твоя случай, но имай предвид че това не го препоръчвам, понеже ще извади всички споменати домейни в документа:

docx2txt 1.docx - | grep -E  "[a-zA-Z0-9]+([-.]?[a-zA-Z0-9]+)*.[a-zA-Z]" | sed 's/https\?:\/\///' | awk -F "/" '{ print  $1 }' | sed 's/www.//1' | grep -v -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | grep -E  "[a-zA-Z0-9]+([-.]?[a-zA-Z0-9]+)*.[a-zA-Z]+$" | grep -v " " | sort -u

Ако имаш документ и трябва да направиш списък и в документа примерно пише: Тези са ... но тези не са.... Ти ще направиш списък с всички. И пак казвам, това е според подадения пример. Не може да е универсално.

wc -l

връща 33


ПП: Променил съм го , така че го пробвай пак. Стайлинга тук не го харесва много :)
« Последна редакция: Oct 08, 2019, 23:09 от makeme »
Активен

Distributions:  UbuntuMate 14.04; 15.10; 16.04, CentOS 6.x, 7.x, Kali 2.0 ...

4096bits

  • Напреднали
  • *****
  • Публикации: 3278
    • Профил
Сега...
Проблемът с файла е точно, че не е текст. Docx формата е zip компресия с един куп xml файлове вътре.
За Python има eдин модул python-docx и мислех директно с docx файла да работя. Обаче енкодинга е тотално объркан, както в повечето документи на български, щото май почти никой не е чувал за utf-8.
Успявам да извадя уеб адресите от втората колона на първата таблица например, но някои просто излизат като празен низ. Документа с една дума може да се нарече каша.

Ето за пример, какво излиза при този опит.

Код:



www.afh.bg



www.legalcfd.com


www.ptbanc.com











www.cryptofg.com

www.payboutique.com





www.omegafx.io
Празните редове предполагам ги виждаш.

Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

4096bits

  • Напреднали
  • *****
  • Публикации: 3278
    • Профил
Така...
XML е шитняна работа и парсването е кошмар. А и отдавна не бях пипал Python, та забавих и покрай някакви елементарни грешки.
Както казах, има модул направен за работа с docx документи, обаче в предния ми пост се видя, че читаво не излиза. Почти всичко липсва. Затова се хванах директно да работя с XML-а, с инструментите, които си идват с Питоня. Едва ли ще искаш да инсталираш модули.

Скрипта:

Код:
import sys
import xml.etree.ElementTree as et
import zipfile as zf

zip = zf.ZipFile(sys.argv[1])
doc = zip.open('word/document.xml')

tree = et.parse(doc)
root = tree.getroot()

ns = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}

urls = []
for table in root.findall(".//w:tbl", ns):
    urls.extend([cell.text for cell in table.findall('.//w:t', ns)])

domains = []
for url in urls:
    if url.startswith('http'):
        domains.append(url.strip().split('//')[1].split('/')[0].lstrip('www.'))
    elif url.startswith('www'):
        domains.append(url.split('/')[0].lstrip('www.'))
    else:
        domains.append(url.split('/')[0])
   
for domain in sorted(list(set(domains))):
    print(domain)

Файлът отново се задава като параметър, та да можеш да си посочваш, каквото желаеш.
Изходът от горното върху docx файла, за когото даде линк:

aba.marketing
afh.bg
alphabetfx.com
arotrade.com
brokerz.com
cfds100.com
crypto.com
cryptofg.com
ellingtoninv.com
en.utrader.com
finarix.com
finixcapital.com
finmaxbo.com
finmaxcfd.com
fxnobels.io
infinitrade.com
investingcapital.com
jpm-invest.com
legalcfd.com
marketscfd.net
nextcoinmarket.com
olssoncapital.com
olympusmarkets.com
omegafx.io
payboutique.com
pbncapital.com
profit-trade.com
ptbanc.com
royalcbank.com
sternmarkets.com
swissinv24.com
trader.online
umarkets.com

Чакам си бирата  ;D
« Последна редакция: Oct 09, 2019, 01:51 от 4096bits »
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

supportpc

  • Напреднали
  • *****
  • Публикации: 99
    • Профил
много благодаря трябва да почерпя
Така...
XML е шитняна работа и парсването е кошмар. А и отдавна не бях пипал Python, та забавих и покрай някакви елементарни грешки.
Както казах, има модул направен за работа с docx документи, обаче в предния ми пост се видя, че читаво не излиза. Почти всичко липсва. Затова се хванах директно да работя с XML-а, с инструментите, които си идват с Питоня. Едва ли ще искаш да инсталираш модули.

Скрипта:

Код:
import sys
import xml.etree.ElementTree as et
import zipfile as zf

zip = zf.ZipFile(sys.argv[1])
doc = zip.open('word/document.xml')

tree = et.parse(doc)
root = tree.getroot()

ns = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}

urls = []
for table in root.findall(".//w:tbl", ns):
    urls.extend([cell.text for cell in table.findall('.//w:t', ns)])

domains = []
for url in urls:
    if url.startswith('http'):
        domains.append(url.strip().split('//')[1].split('/')[0].lstrip('www.'))
    elif url.startswith('www'):
        domains.append(url.split('/')[0].lstrip('www.'))
    else:
        domains.append(url.split('/')[0])
   
for domain in sorted(list(set(domains))):
    print(domain)

Файлът отново се задава като параметър, та да можеш да си посочваш, каквото желаеш.
Изходът от горното върху docx файла, за когото даде линк:

aba.marketing
afh.bg
alphabetfx.com
arotrade.com
brokerz.com
cfds100.com
crypto.com
cryptofg.com
ellingtoninv.com
en.utrader.com
finarix.com
finixcapital.com
finmaxbo.com
finmaxcfd.com
fxnobels.io
infinitrade.com
investingcapital.com
jpm-invest.com
legalcfd.com
marketscfd.net
nextcoinmarket.com
olssoncapital.com
olympusmarkets.com
omegafx.io
payboutique.com
pbncapital.com
profit-trade.com
ptbanc.com
royalcbank.com
sternmarkets.com
swissinv24.com
trader.online
umarkets.com

Чакам си бирата  ;D
Активен

supportpc

  • Напреднали
  • *****
  • Публикации: 99
    • Профил
много благодаря трябва да почерпя
Ето ти и за твоя случай, но имай предвид че това не го препоръчвам, понеже ще извади всички споменати домейни в документа:

docx2txt 1.docx - | grep -E  "[a-zA-Z0-9]+([-.]?[a-zA-Z0-9]+)*.[a-zA-Z]" | sed 's/https\?:\/\///' | awk -F "/" '{ print  $1 }' | sed 's/www.//1' | grep -v -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | grep -E  "[a-zA-Z0-9]+([-.]?[a-zA-Z0-9]+)*.[a-zA-Z]+$" | grep -v " " | sort -u

Ако имаш документ и трябва да направиш списък и в документа примерно пише: Тези са ... но тези не са.... Ти ще направиш списък с всички. И пак казвам, това е според подадения пример. Не може да е универсално.

wc -l

връща 33


ПП: Променил съм го , така че го пробвай пак. Стайлинга тук не го харесва много :)
Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 3278
    • Профил
Забравих да добавя и шибанг реда най-горе, та ако ще го ползваш, може на първия ред да сложиш едно

#!/usr/bin/env python3

И може празен ред отдолу просто за по-лесна четимост.
Успешен ден!
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

supportpc

  • Напреднали
  • *****
  • Публикации: 99
    • Профил
направих го стана прекрасно още веднъж ти благодаря
Забравих да добавя и шибанг реда най-горе, та ако ще го ползваш, може на първия ред да сложиш едно

#!/usr/bin/env python3

И може празен ред отдолу просто за по-лесна четимост.
Успешен ден!
« Последна редакция: Oct 09, 2019, 10:54 от supportpc »
Активен

4096bits

  • Напреднали
  • *****
  • Публикации: 3278
    • Профил
Активен

As they say in Mexico, "Dasvidaniya!" Down there, that's two vidaniyas.

supportpc

  • Напреднали
  • *****
  • Публикации: 99
    • Профил
Активен