Python Beautiful Soup: extrakce adresy z HTML stránky

Python Beautiful Soup: extrakce adresy z HTML stránky
« kdy: 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
« Poslední změna: 16. 10. 2020, 08:57:23 od Petr Krčmář »


Re:python beautifulsoup vyextraktovanie adresy s HTML stranky
« Odpověď #1 kdy: 16. 10. 2020, 08:14:01 »
Aby to nebolo ze som nic neskusal a len cakam na odpoved.
Skusal som to riesit jednoducho.
Kód: [Vybrat]
# 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.

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #2 kdy: 16. 10. 2020, 09:26:36 »
Hleda to string ne XPath:

Kód: [Vybrat]
soup.find_all('<a href="mailto:')
nebo, pouzij regularni vyraz:

Kód: [Vybrat]
soup.find_all(re.compile(regexp))
Na prohledani slozky to muzes udelat v shellu:

Kód: [Vybrat]
find /adresar -type f -name "*.html" | xargs parser.py > vystup.txt

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #3 kdy: 16. 10. 2020, 09:31:40 »
Ok takze to co potrebujem okolo extrakcie mailu som doriesil takto

Kód: [Vybrat]
# 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.

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #4 kdy: 16. 10. 2020, 10:00:47 »
a tu som narazil na problem pretoze pre beautifulsoap nemoze byt cesta C:\\nieco ale musi zacinat http:


Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #5 kdy: 16. 10. 2020, 10:22:49 »
A posledna verzia ktora mi nechce zapisovat do file na novy riadok vyzera asi takto
Kód: [Vybrat]
# 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")
       
   
           

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #6 kdy: 16. 10. 2020, 10:25:10 »
Ne, Beautiful Soup potrebuje data:

Kód: [Vybrat]
data = open('C:/Users/foo/Desktop/soubur.html')

soup = BeautifulSoup(data.read(), "lxml")
....


Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #7 kdy: 16. 10. 2020, 10:27:09 »
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.

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #8 kdy: 16. 10. 2020, 10:28:10 »
Nemuzes to ve smycce otervirat porad dokola:

Kód: [Vybrat]
vystup = open(file_path, "w")

for ...
            f.write(vystup.write(... + '\n')

vystup.close()

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #9 kdy: 16. 10. 2020, 10:30:59 »
Citace
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.

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #10 kdy: 17. 10. 2020, 00:16:37 »
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...

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #11 kdy: 17. 10. 2020, 10:08:53 »
Dakujem kolektivnemu vedomiu.
Nakoniec mi to spravilo presne co som potreboval.
 Marek Turnovec: ano os.walk bola cesta viz moj prispevok 10:20

tecka

  • ***
  • 138
    • Zobrazit profil
    • E-mail
Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #12 kdy: 17. 10. 2020, 14:38:07 »
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.

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #13 kdy: 17. 10. 2020, 16:24:29 »
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. :-)

Re:Python Beautiful Soup: extrakce adresy z HTML stránky
« Odpověď #14 kdy: 18. 10. 2020, 11:02:19 »
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.