2016-09-30 2 views
2

Я пытаюсь написать небольшой скребок в python, и я думаю, что столкнулся с проблемой кодирования. Я пытаюсь скрести http://www.resident-music.com/tickets (в частности таблицу на странице) - строка может выглядеть примерно так -£ отображение в urllib2 и Beautiful Soup

<tr> 
     <td style="width:64.9%;height:11px;"> 
     <p><strong>the great escape 2017&nbsp; local early bird tickets, selling fast</strong></p> 
     </td> 
     <td style="width:13.1%;height:11px;"> 
     <p><strong>18<sup>th</sup>&ndash; 20<sup>th</sup> may</strong></p> 
     </td> 
     <td style="width:15.42%;height:11px;"> 
     <p><strong>various</strong></p> 
     </td> 
     <td style="width:6.58%;height:11px;"> 
     <p><strong>&pound;55.00</strong></p> 
     </td> 
     </tr> 

Я по существу пытается заменить &pound;55.00 с £ 55, а также любые другие «не- текст "гадости.

Я пробовал несколько разных кодировок, которые вы можете использовать с beautifulsoup, и urllib2 - безрезультатно, я думаю, что я просто делаю все это неправильно.

Благодаря

ответ

2

Вы хотите экранирования в HTML, который вы можете сделать с помощью html.unescape в Python3:

In [14]: from html import unescape 

In [15]: h = """<tr> 
    ....:   <td style="width:64.9%;height:11px;"> 
    ....:   <p><strong>the great escape 2017&nbsp; local early bird tickets, selling fast</strong></p> 
    ....:   </td> 
    ....:   <td style="width:13.1%;height:11px;"> 
    ....:   <p><strong>18<sup>th</sup>&ndash; 20<sup>th</sup> may</strong></p> 
    ....:   </td> 
    ....:   <td style="width:15.42%;height:11px;"> 
    ....:   <p><strong>various</strong></p> 
    ....:   </td> 
    ....:   <td style="width:6.58%;height:11px;"> 
    ....:   <p><strong>&pound;55.00</strong></p> 
    ....:   </td> 
    ....:  </tr>""" 

In [16]: 

In [16]: print(unescape(h)) 
<tr> 
     <td style="width:64.9%;height:11px;"> 
     <p><strong>the great escape 2017  local early bird tickets, selling fast</strong></p> 
     </td> 
     <td style="width:13.1%;height:11px;"> 
     <p><strong>18<sup>th</sup>– 20<sup>th</sup> may</strong></p> 
     </td> 
     <td style="width:15.42%;height:11px;"> 
     <p><strong>various</strong></p> 
     </td> 
     <td style="width:6.58%;height:11px;"> 
     <p><strong>£55.00</strong></p> 
     </td> 
     </tr> 

Для использования python2:

In [6]: from html.parser import HTMLParser 

In [7]: unescape = HTMLParser().unescape 

In [8]: print(unescape(h)) 
<tr> 
     <td style="width:64.9%;height:11px;"> 
     <p><strong>the great escape 2017  local early bird tickets, selling fast</strong></p> 
     </td> 
     <td style="width:13.1%;height:11px;"> 
     <p><strong>18<sup>th</sup>– 20<sup>th</sup> may</strong></p> 
     </td> 
     <td style="width:15.42%;height:11px;"> 
     <p><strong>various</strong></p> 
     </td> 
     <td style="width:6.58%;height:11px;"> 
     <p><strong>£55.00</strong></p> 
     </td> 

Вы можете увидеть, как правильно все экранирования в не только знак фунта.

1

Я использовал requests для этого, но, надеюсь, вы можете сделать это с помощью urllib2 также. Так вот код:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import requests 
from BeautifulSoup import BeautifulSoup 

soup = BeautifulSoup(requests.get('your_url').text) 
chart = soup.findAll(name='tr') 
print str(chart).replace('&pound;',unichr(163)) #replace '&pound;' with '£' 

Теперь вы должны взять ожидаемый выход!

выход

Пример:

... 
<strong>£71.50</strong></p> 
... 

Во всяком случае о разборе вы можете сделать это с многими способами, что было интересно здесь: print str(chart).replace('&pound;',unichr(163)), который был довольно сложной задачей :)

Update

Если вы хотите избежать более одного (или даже одного) персонажа (например, тире, фунтах и ​​т. Д.), Вам было бы проще/эффективнее использовать parser, как в ответе Падрейка. Иногда вы также читаете комментарии, которые они обрабатывают, и другие проблемы с кодировкой.

+0

Это не то, как вы хотите unescape html, это будет означать замену вызова для каждого экранированного объекта на странице, и сама начальная строка также может вызвать ошибку кодирования. Я также не буду поощрять использование BeautifulSoup3. –

+0

Я уважаю ваш комментарий, но я не соглашусь с вами, если вы посмотрите здесь: https://wiki.python.org/moin/EscapingHtml вы увидите, что те готовые libs делают то же самое, что и я в одном с той разницей, что они дают вам готовые результаты, которые я лично не одобряю. В некоторых случаях они выполняют эту работу, но это была очень конкретная и легкая задача. Что касается 'bs3' вместо' bs4', действительно не имеет значения, что хочет сделать OP. Но опять же я уважаю ваше мнение! – coder

+0

* Я по существу стараюсь заменить £ 55,00 на £ 55, ** и любые другие «нетекстовые» гадости. ***. * Другие «нетекстовые» гадости * - это экранированные объекты, которые могут быть любыми из множества. Также имеет значение, bs3 сломан и больше не поддерживается. –

Смежные вопросы