1

我有一个这样的链接 <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符号。(这里是有问题的字符串)

4

3 回答 3

0

您可以包含[\u0000-\uFFFF]作为 re 模式中的子范围或仅包含 \xb4 作为[\u00b4]

于 2013-07-23T23:25:00.107 回答
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))

它正确打印出\xb4URL 中的链接。

于 2013-07-23T23:55:52.547 回答
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 是重音

于 2013-07-23T23:58:28.173 回答