Очевидно, что у BS недооцененная проблема при разборе амперсандов внутри URL , я только что искал в их дискуссионном форуме «точка с запятой». Согласно этой дискуссии 2009 года, обнаженная &
строго недействительна и должна быть заменена на &
, хотя браузеры принимают это, так что кажется, что все в порядке с педантизмом.
Я согласен с тем, что это разбор является поддельным, и вы должны связаться с их списком, чтобы попросить их как минимум документировать это как известную проблему и исправить ее в будущем.
Обходной путь: В любом случае, ваш обходной путь, скорее всего, будет re.sub(...)
для захвата и расширения &
-> &
только внутри URL-адресов. Возможно, вам нужна обратная функция для сжатия их на выходе. Вам понадобится более красивое регулярное выражение для захвата только амперсандов внутри URL, но в любом случае:
# Minimal string to tickle this
#html = "<html>example.com/a.php?b=2&c=15&d=42</html>"
html = "<html>example.com/a.php?b=2&c=15&d=29&e=42</html>"
html = re.sub(r'&(?!amp;)', r'&', html)
parsed = BeautifulSoup.BeautifulSoup(html)
>>> print parsed.text.encode('utf-8')
'example.com/a.php?b=2&c=15'
>>> re.sub(r'&', r'&', parsed.text.encode('utf-8'))
'example.com/a.php?b=2&c=15'
Могут быть и другие, более BS-тонические подходы.
Вы можете помочь протестировать бета-версию 4.0.