Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Wangarad 16. 10. 2020, 08:05:20
-
Zdravim.
Potreboval by som trosku pomoct. Snazim sa pomocov pythonu a beautifulsoup vyextraktovat vsetky odkazy s HTML stranok ktore mam offline v subore. Mame databazu kientov ale vsetko su to "generovane" staticke HTML stranky a potrebujem to ponahadzovat do DB.
Mam 2 problemy:
- ako vyextraktovat len <a href="mailto:
- a druhu ako vyhladat vsetky subory v zlozke. Teda v zlozke files je cca 5000 stranok a nenapadlo ma ako ich prechadzat jednu po druhej.
Dik za radu
-
Aby to nebolo ze som nic neskusal a len cakam na odpoved.
Skusal som to riesit jednoducho. # importing the libraries
from bs4 import BeautifulSoup
import requests
url="xxx/firma-kontakt-cinnost.html"
# Make a GET request to fetch the raw HTML content
html_content = requests.get(url).text
# Parse the html content
soup = BeautifulSoup(html_content, "lxml")
for link in soup.find_all('a[href^=mailto]'):
print("Inner Text: {}".format(link.text))
print("Title: {}".format(link.get("title")))
print("href: {}".format(link.get("href")))
co mi nevracia vobec nic
ak zmenim for link in soup.find_all('a'):
take mam zasa vsetky linky. Ak na to nepridem take budem musit potom este prefiltrovat len odkazy kde je @ ale to mi nepride ako elegantne riesenie.
-
Hleda to string ne XPath:
soup.find_all('<a href="mailto:')
nebo, pouzij regularni vyraz:
soup.find_all(re.compile(regexp))
Na prohledani slozky to muzes udelat v shellu:
find /adresar -type f -name "*.html" | xargs parser.py > vystup.txt
-
Ok takze to co potrebujem okolo extrakcie mailu som doriesil takto
# importing the libraries
from bs4 import BeautifulSoup
import requests
import os.path
directory = 'C:/xxx/output/'
filename = "vystup.txt"
file_path = os.path.join(directory, filename)
print (file_path)
url="xxx/firma-kontakt-cinnost.html"
# Make a GET request to fetch the raw HTML content
html_content = requests.get(url).text
# Parse the html content
soup = BeautifulSoup(html_content, "lxml")
for link in soup.select('a[href^=mailto]'):
print("Inner Text: {}".format(link.text))
f = open(file_path, "w")
f.write(format(link.text)+"\n")
f.close()
Ostava mi posledny task a sice ako zistit vsetky subory v zlozke a spracovat ich.
IDontCare: shell nemam bohuzial takze to musism skrz python. Ale dakujem ked som pisal toto tak si akurat napisal ty.
-
a tu som narazil na problem pretoze pre beautifulsoap nemoze byt cesta C:\\nieco ale musi zacinat http:
-
A posledna verzia ktora mi nechce zapisovat do file na novy riadok vyzera asi takto
# importing the libraries
from bs4 import BeautifulSoup
import requests
import os.path
directory = 'C:/My Web Sites/complette/output/'
filename = "vystup.txt"
file_path = os.path.join(directory, filename)
print (file_path)
from bs4 import BeautifulSoup
for path, dirs, files in os.walk(r"C:/My Web Sites/complette/"):
for f in files:
html_files = os.path.join(path, f)
print(html_files)
# Parse the html content
soup = BeautifulSoup(open(html_files, encoding="utf-8"), "lxml")
for link in soup.select('a[href^=mailto]'):
print("Inner Text: {}".format(link.text))
f = open(file_path, "w")
f.write(format(link.text)+"\n")
-
Ne, Beautiful Soup potrebuje data:
data = open('C:/Users/foo/Desktop/soubur.html')
soup = BeautifulSoup(data.read(), "lxml")
....
-
IDontCare: dik moc to som uz "dal". S nieakeho dovodu mi to nechcelo bezat ako si pisal ty a musel som to trosku zmenit.
Kazdopadne zapis do suboru nefunguje dobre ale to poriesim trosku neskorsie. (navsteva)
Medzi casom by ma zaujimalo ako by sa to dalo riesit efektivnejsie. Rozmyslam nad tym pridavat to do pola a to potom naraz zapisat ale chcel by som vediet ako by k tomu pristupoval niekto iny.
-
Nemuzes to ve smycce otervirat porad dokola:
vystup = open(file_path, "w")
for ...
f.write(vystup.write(... + '\n')
vystup.close()
-
Rozmyslam nad tym pridavat to do pola a to potom naraz zapisat ale chcel by som vediet ako by k tomu pristupoval niekto iny.
Asi tak, nacist do pole a na zaver zapsat. Neni na to co vypelsovat. Ve smycce vezmes soubor, rozparsujes, ulozs data. Hotovo.
-
Koukám tady se sešla spousta expertů na Python... Na procházení adresáře používat shell? Proboha na co, když už to jednou píše v Pythonu?
I Python má způsoby, jak procházet všechny soubory v adresáři. Třeba os.listdir(): for soubor in os.listdir('.'): zpracuj_soubor().
Nebo pokud by ty soubory mohly být i v různých podadresářích, tak doporučuji třeba os.walk().
Zkombinovat to s BS už doufám tazatel zvládne...
-
Dakujem kolektivnemu vedomiu.
Nakoniec mi to spravilo presne co som potreboval.
Marek Turnovec: ano os.walk bola cesta viz moj prispevok 10:20
-
Koukám tady se sešla spousta expertů na Python... Na procházení adresáře používat shell? Proboha na co, když už to jednou píše v Pythonu?
Výhody jednoduchého skriptu, který dělá jen jednu věc a jde použít, jak si zrovna v danou chvíli zamanu, si jako Linuxáci snad nemusíme představovat.
-
Koukám tady se sešla spousta expertů na Python... Na procházení adresáře používat shell? Proboha na co, když už to jednou píše v Pythonu?
Výhody jednoduchého skriptu, který dělá jen jednu věc a jde použít, jak si zrovna v danou chvíli zamanu, si jako Linuxáci snad nemusíme představovat.
Jasně, takže mám tady úkol: Kopa souboru a z nich chci vytahat všechny mailové adresy. Tak proč si na to nenapsat pěkný jednoúčelový skript, který tuto úlohu vyřeší? Python je na podobné úlohy jako dělaný. Stejně jako třeba Perl. Proč to ale komplikovat tím, že část té úlohy budu řešit v Pythonu a část v shellu? To vám fakt přijde jednodušší? Tím spíš, pokud je to v prostředí, kde pořádný shell nemám (Windows)?
Původní tazatel také psal něco o nějaké databázi. Bych čekal, že ke každému mailu budou ještě nějaké další informace - třeba jméno. Pokud jde ale jen o vytahání mailových adres, tak mi to přijde trošičku podezřelé - protože tohle je většinou ten typ úlohy, který řeší různí spammeři - potřebují odněkud vytahat jen co nejvíc e-mailových adres a k nim žádné další informace nepotřebují. Ale doufám, že se pletu. :-)
-
Marek Turnovec: ano je k tomu aj DB s userID meno atd atd. Kazdopadne toto bolo viac menej demo ako na to.
Dakujem za pomoc doriesil som co som potreboval
https://github.com/TomasTrnkaPLC/python-webpage-offline-parsher ak by niekoho zaujimalo ako to dopadlo.
-
Dakujem za pomoc doriesil som co som potreboval
https://github.com/TomasTrnkaPLC/python-webpage-offline-parsher ak by niekoho zaujimalo ako to dopadlo.
Teda sice je ten tvůj kód prasárna, ale účel to splnilo. :)
-
Bugsa : no viem ze to nie je super kod ale snazim sa najlepsie ako viem.