我有一个像<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
符号。 (这是有问题的字符串)
答案 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)