pythonbeautifulsoupxmldatasource

Financial News Analysis - Unble to extract data from tags and convert it into text


I am extracting financial data from the website and like to store it in the data frame later for sentiment analysis.

Issues:

  1. When I use for loop to process all the items I am not able to
    convert it to the text which results in data with tags. (for a single item, it works)
  2. Description tag has /n at the beginning and end. How can I simply remove it?
  3. Need to extarct URL. Tag "a" class="plcReadMore" has URL which i like to extract. Issue - href is present within tag e.g. < a class="plcReadMore" href="/placera/telegram/2020/05/19/valueguard-bostadspriser-20-i-april-sasongsrensat-19.html">Läs hela >

Python code to extract HTML data and put it into data frame for further analysis:

import requests
from bs4 import BeautifulSoup
import pandas as pd

url = "https://www.avanza.se/placera/rutor/alla-foretagsartiklar.7.19888.a.html"
resp = requests.get(url)
soup = BeautifulSoup(resp.content, features="xml")
print(soup.prettify())
items = soup.findAll('div')
print(items)
# Checked single items and converted into text
print(items[0])
print(items[0].a.text)
print(items[0].p.text)
print(items[0].find("a", class_="plcReadMore"))
# Issue starts here when we process multiple items
list_items = []
for item in items:
    list_item = {}
    title_temp =
    list_item['title'] = item.a
    list_item['description'] = item.p
    # list_item['URL']= item.find("a", {"class": "plcReadMore"})
    list_item['URL'] = getattr(item.find("p", {"class": "plcReadMore"}), 'text', None)
    list_items.append(list_item)
print(list_items[0])
df = pd.DataFrame(list_items, columns=['title', 'description', 'URL'])
df.head() 

Source XML Code:

    <!-- Unable to get href from tag a under class "plcReadMore"-->
    <?xml version="1.0" encoding="utf-8"?>
    <ul class="cleanList plcTeaserList XSText">
     <li class="active">
      <div class="item">
       <div class="cell">
        <div class="expand">
         <a class="title" href="#">
          BOSTADSPRISER -2,0% I APRIL, SÄSONGSRENSAT -1,9%
         </a>
         <p class="shortIntro">
          STOCKHOLM (Nyhetsbyrån Direkt) Bostadspriserna i Sverige sjönk 2,0 procent i april jämfört med föregående månad. Säsongsrensat sjönk priserna 1,9 procent.Det visar Valueguards HOX-index.Bostadspriserna har sjunkit 1,2 procent under den senaste tremån
         </p>
        </div>
        <a class="plcReadMore" href="/placera/telegram/2020/05/19/valueguard-bostadspriser-20-i-april-sasongsrensat-19.html">
         Läs hela
        </a>
       </div>
       <div class="cell writerCol XXSText">
        <div class="writer">
         Direkt
        </div>
       </div>
       <div class="cell dateCol XXSText">
        Idag 06:00
       </div>
      </div>
     </li>
     <li>
      <div class="item">
       <div class="cell">
        <div class="expand">
         <a class="title" href="#">
          Bonavas styrelseordförande köper 5 000 aktier
         </a>
         <p class="shortIntro">
          Bostadsutvecklaren Bonavas styrelseordförande Mikael Norman har den 15 maj köpt 5 000B-aktier i bolaget. Aktierna köptes till kursen 38,92 kronor per aktie, en affär på 195 000 kronor. Affären gjordes på Nasdaq Stockholm. Det framgår av Finansinspekt
         </p>
        </div>
        <!-- Here comes the issue -->
        <a class="plcReadMore" href="/placera/telegram/2020/05/15/bonava-bonavas-styrelseordforande-koper-5-000-aktier.html">
         Läs hela
        </a>
       </div>
       <div class="cell writerCol XXSText">
        <div class="writer">
         Finwire
        </div>
       </div>
       <div class="cell dateCol XXSText">
        2020-05-15
       </div>
      </div>
     </li>
     <li>
      <div class="item">
       <div class="cell">
        <div class="expand">
         <a class="title" href="#">
          Nordea mäklar post på 1,0 procent av aktierna i Bonava
         </a>
         <p class="shortIntro">
          Nordea mäklade på fredagen en post på 1,06 miljoner B-aktier i bostadsutvecklaren Bonava inbördes till kursen 38,16 kronor per aktie. Affären är på 40,4 miljoner kronor och motsvarar 1,0 procent av aktierna i bolaget.
         </p>
        </div>
        <a class="plcReadMore" href="/placera/telegram/2020/05/15/bonava-nordea-maklar-post-pa-10-procent-av-aktierna-i-bonava.html">
         Läs hela
        </a>
       </div>
       <div class="cell writerCol XXSText">
        <div class="writer">
         Finwire
        </div>
       </div>
       <div class="cell dateCol XXSText">
        2020-05-15
       </div>
      </div>
     </li>
     <li>
      <div class="item">
       <div class="cell">
        <div class="expand">
         <a class="title" href="#">
          Bonavas vd har ökat med 10 000 aktier
         </a>
         <p class="shortIntro">
          Bostadsutvecklaren Bonavas vd Joachim Hallengren har ökat innehavet med 10 000 aktier. Den totala köpesumman uppgår till 366 594 kronor med ett genomsnittspris på 36,66 kronor per aktie. Det framgår av Finansinspektionens insynsregister.
         </p>
        </div>
        <a class="plcReadMore" href="/placera/telegram/2020/05/15/bonava-bonavas-vd-har-okat-med-10-000-aktier.html">
         Läs hela
        </a>
       </div>
       <div class="cell writerCol XXSText">
        <div class="writer">
         Finwire
        </div>
       </div>
       <div class="cell dateCol XXSText">
        2020-05-15
       </div>
      </div>
     </li>
     <li>
      <div class="item">
       <div class="cell">
        <div class="expand">
         <a class="title" href="#">
          VD JOACHIM HALLENGREN KÖPT AKTIER FÖR 0,4 MLN KR (OMS)
         </a>
         <p class="shortIntro">
          (Omsändning: skickades första gången på torsdagskvällen)STOCKHOLM (Nyhetsbyrån Direkt) Joachim Hallengren, som är vd för bostadsutvecklaren Bonava, har på torsdagen köpt 10.000 aktier i bolaget för en köpeskilling om närmare 0,4 miljoner kronor.Det f
         </p>
        </div>
        <a class="plcReadMore" href="/placera/telegram/2020/05/15/bonava-vd-joachim-hallengren-kopt-aktier-for-04-mln-kr-oms.html">
         Läs hela
        </a>
       </div>
       <div class="cell writerCol XXSText">
        <div class="writer">
         Direkt
        </div>
       </div>
       <div class="cell dateCol XXSText">
        2020-05-15
       </div>
      </div>
     </li>
     <li>
      <div class="item">
       <div class="cell">
        <div class="expand">
         <a class="title" href="#">
          VD JOACHIM HALLENGREN KÖPT AKTIER FÖR 0,4 MLN KR
         </a>
         <p class="shortIntro">
          STOCKHOLM (Nyhetsbyrån Direkt) Joachim Hallengren, som är vd för bostadsutvecklaren Bonava, har på torsdagen köpt 10.000 aktier i bolaget för en köpeskilling om närmare 0,4 miljoner kronor.Det framgår av Finansinspektionens insynsrapportering. Köpet
         </p>
        </div>
        <a class="plcReadMore" href="/placera/telegram/2020/05/14/bonava-vd-joachim-hallengren-kopt-aktier-for-04-mln-kr.html">
         Läs hela
        </a>
       </div>
       <div class="cell writerCol XXSText">
        <div class="writer">
         Direkt
        </div>
       </div>
       <div class="cell dateCol XXSText">
        2020-05-14
       </div>
      </div>
     </li>
     <li>
      <div class="item">
       <div class="cell">
        <div class="expand">
         <a class="title" href="#">
          Aktierna som fått sänkta riktkurser
         </a>
         <p class="shortIntro">
          <span class="bold plcVignette upperCase">
           Börs:
          </span>
          141 aktier på börsen har fått se sina genomsnittliga riktkurser sänkas under de senaste sex månaderna. I fyra av aktierna har riktkurserna sänkts med över 50 procent.
         </p>
        </div>
        <a class="plcReadMore" href="/placera/redaktionellt/2020/05/13/aktierna-som-fatt-sankta-riktkurser.html">
         Läs hela
        </a>
       </div>
       <div class="cell writerCol XXSText">
        <div class="writer">
         Karl Lans
        </div>
       </div>
       <div class="cell dateCol XXSText">
        2020-05-13
       </div>
      </div>
     </li>
    </ul>

Solution

  • Modified your script a bit to get title, description and href. Hopefully your questions are answered in-line.

    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    
    url = "https://www.avanza.se/placera/rutor/alla-foretagsartiklar.7.19888.a.html"
    r = requests.get(url)
    soup = BeautifulSoup(r.content, "lxml")
    base_url='https://www.avanza.se'
    
    items = soup.find_all('div',{'class':'item'})
    list_items = []
    for item in items:
        list_item = {}
        # === this gets title, description and href ===
        title=item.a.text
        description=item.find('p',{'class':'shortIntro'}).text.strip() # strip() removes whitespace around description
        href=item.find('a',{'class':'plcReadMore'}).get('href')
        #===============================================
        list_item['title'] = title
        list_item['description'] = description
        list_item['URL'] = base_url + href
        list_items.append(list_item)
    
    df = pd.DataFrame(list_items, columns=['title', 'description', 'URL'])