使用BeautifulSoup解析不常见的符号

时间:2013-07-23 22:54:55

标签: python regex beautifulsoup

我有一个像<a href=abc.asp?xyz=foobar&baz=lookatme´_beautiful.jpg>这样的链接,其中有一个不寻常的符号´,它甚至不存在于标准的英文键盘中。 它是Ctrl+k在此编辑器中生成的符号的镜像反射。 所以在运行stackoverflow上找到的代码之后:

soup = BeautifulSoup.BeautifulSoup("<a href=abc.asp?xyz=foobar&baz=lookatme´_beautiful.jpg>");
for a in soup.findAll('a'):                                                                       
    print a['href']

输出为abc.asp?xyz=foobar&baz=lookatme,但我希望abc.asp?xyz=foobar&baz=lookatme´_beautiful.jpg。我正在抓取的网站位于.br域中。有些着作是在葡萄牙语中,即使链接是英文的,但这种不常见的符号可能不是有效的英语符号。有什么想法或建议吗?

编辑:我看了Python字符串产生的表示,它是<a href=abc.asp?xyz=foobar&baz=lookatme\xb4_beautiful.jpg>

一种方法是生成自定义正则表达式,此代码段也来自stackoverflow:

import re
urls = re.findall(r'href=[\'"]?([^\'" >]+)', s)

如果无法修改beautifulsoup正则表达式,如何修改上述正则表达式以合并\xb4符号。 (这是有问题的字符串)

3 个答案:

答案 0 :(得分:0)

您可以将 [\ u0000- \ uFFFF] 作为重新模式中的子范围包含在内,或者仅将\ xb4包含为 [\ u00b4]

答案 1 :(得分:0)

升级到最新版本的BeautifulSoup并安装html5lib,这是一个非常宽松的解析器:

import requests
from bs4 import BeautifulSoup

html = requests.get('http://www.atlasdermatologico.com.br/listar.asp?acao=indice').text
soup = BeautifulSoup(html, 'html5lib')

for a in soup.find_all('a'):
    href = a.get('href')

    if '\\' in repr(href):
        print(repr(href))

它正确地打印出URL中\xb4的链接。

答案 2 :(得分:0)

你的正则表达式并不关心href=之后的内容,只要它以空格结尾(或在引号中),所以它与任何其他字符一样匹配\ xb4:

>>> s = "<a href=abc.asp?xyz=foobar&baz=lookatme\xb4_beautiful.jpg>"
>>> print s.decode("latin-1")
<a href=abc.asp?xyz=foobar&baz=lookatme´_beautiful.jpg>
>>> urls = re.findall(r'href=[\'"]?([^\'" >]+)', s)
>>> urls
['abc.asp?xyz=foobar&baz=lookatme\xb4_beautiful.jpg']

(顺便说一句,\ xb4是acute accent