Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Extract the text from `p` within `div` with BeautifulSoup

I am very new to web-scraping with Python, and I am really having a hard time with extracting nested text from within HTML (p within div, to be exact). Here is what I got so far:

from bs4 import BeautifulSoup
import urllib

url = urllib.urlopen('http://meinparlament.diepresse.com/')
content = url.read()
soup = BeautifulSoup(content, 'lxml')

This works fine:

links=soup.findAll('a',{'title':'zur Antwort'})
for link in links:
    print(link['href'])

This extraction works fine:

table = soup.findAll('div',attrs={"class":"content-question"})
for x in table:
    print(x)

This is the output:

<div class="content-question">
<p>[...] Die Verhandlungen über die mögliche Visabefreiung für    
türkische Staatsbürger per Ende Ju...
<a href="http://meinparlament.diepresse.com/frage/10144/" title="zur 
Antwort">mehr »</a>
</p>
</div>

Now, I want to extract the text within p and /p. This is the code I use:

table = soup.findAll('div',attrs={"class":"content-question"})
for x in table:
    print(x['p'])

However, Python raises a KeyError.

like image 246
Johannes Schwaninger Avatar asked Apr 19 '16 22:04

Johannes Schwaninger


People also ask

What is the difference between Find_all () and find () in BeautifulSoup?

find is used for returning the result when the searched element is found on the page. find_all is used for returning all the matches after scanning the entire document.


1 Answers

The following code finds and prints the text of each p element in the div's with the class "content-question"

from bs4 import BeautifulSoup
import urllib

url = urllib.urlopen('http://meinparlament.diepresse.com/')
content = url.read()
soup = BeautifulSoup(content, 'lxml')

table = soup.findAll('div',attrs={"class":"content-question"})
for x in table:
    print x.find('p').text

# Another way to retrieve tables:
# table = soup.select('div[class="content-question"]')

The following is the printed text of the first p element in table:

[...] Die Verhandlungen über die mögliche Visabefreiung für türkische Staatsbürger per Ende Juni sind noch nicht abgeschlossen, sodass nicht mit Sicherheit gesagt werden kann, ob es zu diesem Zeitpunkt bereits zu einer Visabefreiung kommt. Auch die genauen Modalitäten einer solchen Visaliberalisierung sind noch nicht ausverhandelt. Prinzipiell ist es jedoch so, dass Visaerleichterungen bzw. -liberalisierungen eine Frage von Reziprozität sind, d.h. dass diese für beide Staaten gelten müssten. [...]

like image 182
Phillip Avatar answered Oct 14 '22 04:10

Phillip