Search code examples
pythonunicodescreen-scrapingpython-re

Text scraping, apostrophe, â\x80\x99, regular expression, python


<div id="product_description" class="sub-header">
        <h2>Product Description</h2>
    </div>
    <p>Dans une France assez proche de la nôtre, un homme s’engage dans la carrière universitaire. Peu motivé par l’enseignement, il s’attend à une vie ennuyeuse mais calme, protégée des grands drames historiques. Cependant les forces en jeu dans le pays ont fissuré le système politique jusqu’à provoquer son effondrement. Cette implosion sans soubresauts, sans vraie révolution, s Dans une France assez proche de la nôtre, un homme s’engage dans la carrière universitaire. Peu motivé par l’enseignement, il s’attend à une vie ennuyeuse mais calme, protégée des grands drames historiques. Cependant les forces en jeu dans le pays ont fissuré le système politique jusqu’à provoquer son effondrement. Cette implosion sans soubresauts, sans vraie révolution, se développe comme un mauvais rêve.Le talent de l’auteur, sa force visionnaire nous entraînent sur un terrain ambigu et glissant ; son regard sur notre civilisation vieillissante fait coexister dans ce roman les intuitions poétiques, les effets comiques, une mélancolie fataliste.Ce livre est une saisissante fable politique et morale. ...more</p>
    



<div class="sub-header">

I want to scrape the text chunk. Could you please tell me what is happening there? My attempt is here.

url = 'https://books.toscrape.com/catalogue/soumission_998/index.html'
response = requests.get(url)
text = response.text

pattern = re.compile(r'<h2>Product Description</h2>\s*</div>\s*<p>(.+?)</p>', re.M | re.S)
brief_dscrp = pattern.findall(text)
brief_dscrp

Result is:

['Dans une France assez proche de la nôtre, un homme sâ\x80\x99engage dans la carrière universitaire. Peu motivé par lâ\x80\x99enseignement, il sâ\x80\x99attend Ã\xa0 une vie ennuyeuse mais calme, protégée des grands drames historiques. Cependant les forces en jeu dans le pays ont fissuré le système politique jusquâ\x80\x99Ã\xa0 provoquer son effondrement. Cette implosion sans soubresauts, sans vraie révolution, s Dans une France assez proche de la nôtre, un homme sâ\x80\x99engage dans la carrière universitaire. Peu motivé par lâ\x80\x99enseignement, il sâ\x80\x99attend Ã\xa0 une vie ennuyeuse mais calme, protégée des grands drames historiques. Cependant les forces en jeu dans le pays ont fissuré le système politique jusquâ\x80\x99Ã\xa0 provoquer son effondrement. Cette implosion sans soubresauts, sans vraie révolution, se développe comme un mauvais rêve.Le talent de lâ\x80\x99auteur, sa force visionnaire nous entraînent sur un terrain ambigu et glissant ; son regard sur notre civilisation vieillissante fait coexister dans ce roman les intuitions poétiques, les effets comiques, une mélancolie fataliste.Ce livre est une saisissante fable politique et morale. ...more']


Solution

  • You should be using a scraping library such as BeautifulSoup instead of regexps. It will deal with this sort of Unicode nonsense in a more graceful way.

    Either way, what you're seeing here is that when you do response.text, requests will attempt to guess the encoding of the page based on the response headers. For some reason, requests has decided the response is ISO-8859-1 for no good reason. (If no encoding had been explicitly specified, it would use the chardet library.)

    You can either force Requests to use chardet:

    response.encoding = None
    text = response.text
    

    or force the known correct encoding,

    response.encoding = "utf-8"
    text = response.text
    

    or just do the decoding from binary content yourself:

    text = response.content.decode("utf-8")
    

    Et voilà:

    ['Dans une France assez proche de la nôtre, un homme s’engage dans la carrière universitaire. Peu motivé par l’enseignement, ...