0

I try to read RSS feeds using python. I use feedparser, and it works well for every feed, except one : https://www.frenchweb.fr/feed

import feedparser
feed = feedparser.parse("https://www.frenchweb.fr/feed")
print(feed)

Output :

{
  'feed': {}, 
  'entries': [], 
  'bozo': 1, 
  'headers': {
    'Date': 'Mon, 09 Oct 2017 08:04:31 GMT', 
    'Server': 'Apache', 
    'Vary': 'Cookie,Accept-Encoding', 
    'Expires': 'Thu, 19 Nov 1981 08:52:00 GMT', 
    'Cache-Control': 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0', 
    'Pragma': 'no-cache', 
    'ETag': '"2be89b4a462dd6d1652745b6e69cfdac"', 
    'X-UA-Compatible': 'IE=edge', 
    'Link': '<https://www.frenchweb.fr/wp-json/>; rel="https://api.w.org/"', 
    'Content-Encoding': 'gzip', 
    'Content-Length': '13440', 
    'Connection': 'close', 
    'Content-Type': 'application/rss+xml; charset="UTF-8"'
  }, 
  'etag': '"2be89b4a462dd6d1652745b6e69cfdac"', 
  'href': 'https://www.frenchweb.fr/feed', 
  'status': 200, 
  'encoding': 'UTF-8', 
  'version': '', 
  'bozo_exception': SAXParseException('XML or text declaration not at start of entity',), 
  'namespaces': {}
}

If in the same code, I just do a simple get, it works, I see the content :

web_page = requests.get(url, headers=headers, allow_redirects=True)
soup = BeautifulSoup(web_page.content, "html.parser")
print(soup)

Output :

<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" 
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:content="http://purl.org/rss/1.0/modules/content/" 
  xmlns:dc="http://purl.org/dc/elements/1.1/" 
  xmlns:media="http://search.yahoo.com/mrss/" 
  xmlns:slash="http://purl.org/rss/1.0/modules/slash/" 
  xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/">
<channel>
<title>FrenchWeb.fr</title>
...

Any clue ?

iero
  • 401
  • 3
  • 14

1 Answers1

4

The feed is invalid: there is a newline at the beginning of the file. If you download it in a text editor, you can see it:

1
2 <?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
3     xmlns:content="http://purl.org/rss/1.0/modules/content/"
4     xmlns:wfw="http://wellformedweb.org/CommentAPI/"
5 [...]

This is a problem because the XML declaration must be on the first line.

If you remove the first newline, it works!

{'bozo': 0,
 'encoding': 'utf-8',
 'entries': [{'author': 'FrenchWeb',
              'author_detail': {'name': 'FrenchWeb'},
              'authors': [{'name': 'FrenchWeb'}],
              'comments': 'https://www.frenchweb.fr/barometre-annuel-de-lexperience-utilisateur-par-kameleoon/305311#respond',
              'guidislink': False,
[...]

EDIT A solution

You can drop the first newline like this:

import feedparser
import requests

url = "https://www.frenchweb.fr/feed"
headers = []
web_page = requests.get(url, headers=headers, allow_redirects=True)
content = web_page.content.strip()  # drop the first newline (if any)
feed = feedparser.parse(content)
Laurent LAPORTE
  • 21,958
  • 6
  • 58
  • 103