I am using the following code to extract text from a web page:
from bs4.element import Comment
import urllib.request
def tag_visible(element):
    if element.parent.name in ['style', 'script', 'head', 'title', 'meta', '[document]',]:
        return False
    if isinstance(element, Comment):
        return False
    return True
def text_from_html(body):
    soup = BeautifulSoup(body, 'html.parser')
    texts = soup.findAll(text=True)
    visible_texts = filter(tag_visible, texts)  
    return u" ".join(t.strip() for t in visible_texts)
    #return ' '.join(texts)
html = urllib.request.urlopen('https://ordoabchao.ca/volume-one/babylon').read()
text = text_from_html(html)
The problem is, when I open text, I get all the links from the bottoms that exist at the top of the page, which I don’t want. How can i modify the above code to do so?
I also gets the footnotes, which i may want, but a separate text. Is there a way to separate the footsnotes from the main text?
Thanks
Advertisement
Answer
If you want to extract all the text then you can use get_text() method
from bs4 import BeautifulSoup 
import requests
url = 'https://ordoabchao.ca/volume-one/babylon'
res = requests.get(url) 
soup = BeautifulSoup(res.text, 'lxml')
for p in soup.select('.sqs-block-content p'):
    print(p.get_text(strip=True))
To save as text file, you can use pandas DataFrame
lst = []
for p in soup.select('.sqs-block-content p'):
    txt= p.get_text(strip=True)
    lst.append({'Text':txt})
df=pd.DataFrame(lst).to_csv('out.txt',sep='t',index= False)
#import
import pandas as pd
