re.search()始终返回None,并且找不到错误

2024-10-03 15:31:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在用西班牙语编写一个法律文件自动阅读器<谢谢你

通过拉网,我得到以下字符串:

'DECAD-2021-368-APN-JGM - Dase por designada Directora de Seguimiento y Evaluación de la Gestión.'

我用type()检查了一下,它是一个字符串,unicode(我不可能以其他方式理解)

问题是我一直在运行这个re.search(),这将允许我或不允许我继续其他进程,并且一直不返回任何结果,我不明白我做错了什么。我也尝试了使用和不使用re.UNICODE标志

    if re.search(r"( Dase por designad[o]?[a]?)",str(b),re.UNICODE) != None:
    return "I'm gonna read it"
else:
    return "I'm not gonna read it"

注:[o]?[a]?当文本提到男性或女性官僚时,是匹配的

我尝试了不同版本的正则表达式:

"( Dase por designad[o]?[a]?)" without r before string.
"( Dase por designad)"
"Dase por designad"

我为这个项目做了大量的搜索(),但出于某种原因,我一直在做这个

我想这一定是个简单的问题,我就是看不出来。 谢谢大家的帮助

回答和添加请求的信息: 我正在用Spyder 5编写和测试这篇文章,它在Anaconda上运行,在Windows 10上运行。Python 3.7.10

Blacknight:我检查了字符串的硬编码,它可以工作。问题是,当字符串来自以下项的返回时,它不会:

link = "/detalleAviso/primera/243131/20210419"  
url = f"https://www.boletinoficial.gob.ar{link}"
req = requests.get(url, headers={'User-Agent': 'Mozilla/5.0'})
    
    
soup = BeautifulSoup(req.content, 'html.parser')
    
a =soup.find(id="tituloDetalleAviso")

b = a.find('h6').text
b = str(b)

若我在控制台中得到打印b,将粘贴复制到硬代码并重新运行,我会得到一个匹配项。但当它来自网络垃圾的时候,它就不存在了

我只是运行b==c:并返回False,其中b是从webscraping返回的,c是该webscrape上次运行的打印

我试过str(b),但不起作用


Tags: 字符串reurlreadsearchreturnunicodelink
2条回答

已经提供的公认答案直接回答了问题。但你真正想问的是“当这种情况发生时,我如何调试它?”

首先,注意详细说明您的需求。如果有人在6个月内给出了这个答案,你的导入是否有效

我在虚拟电视上做了pip install bs4 requests,然后pip freeze,我得到了这个:

$ python -V
Python 3.8.7
$ pip freeze
beautifulsoup4==4.9.3
bs4==0.0.1
certifi==2020.12.5
chardet==4.0.0
idna==2.10
requests==2.25.1
soupsieve==2.2.1
urllib3==1.26.4

其次,包括一个完全可运行的示例。包括import行,以显示导入BeautifulSouprequests等的位置。这为回答者节省了大量时间

第三,您需要保留正在处理的字符串。显然,在您的计算机上,复制/粘贴是在进行某种形式的空白规范化。我不知道为什么,在macOS Big Sur和Emacs上,我可以清楚地看到复制/粘贴的字符串中有时髦的空格:

note the red underlines

考虑到这一点,您需要执行以下操作:

import base64

print(base64.b64encode(b.encode("utf-8")))
print(b)

这种ASCII保护字符串值,使其可以逐位精确地重建,而无需依赖操作系统剪贴板使其保持完好无损。您将得到如下值:

b'REVDQUQtMjAyMS0zNjgtQVBOLUpHTSAtIERhc2UgcG9ywqBkZXNpZ25hZGEgRGlyZWN0b3JhIGRlwqBTZWd1aW1pZW50byB5wqBFdmFsdWFjacOzbiBkZcKgbGHCoEdlc3Rpw7NuLg=='

然后,您可以使用base64.b64decode(...).decode("utf-8")将其加载回,以确保人们可以看到完全相同的内容,即使被刮取的网页发生了更改

最后,您可能希望自己调查字符串,以准确了解这些不可见字符是什么。下面是一个快速程序,它可以让您使用内置的unicodedata模块很好地了解字符串中不可见项、控制字符、空白等的情况:

import unicodedata

for character in text:
    print(repr(character), "-", unicodedata.name(character))

字符串的输出片段显示:

'p' - LATIN SMALL LETTER P
'o' - LATIN SMALL LETTER O
'r' - LATIN SMALL LETTER R
'\xa0' - NO-BREAK SPACE
'd' - LATIN SMALL LETTER D
'e' - LATIN SMALL LETTER E
's' - LATIN SMALL LETTER S

所以你可以看到所有的时髦空间都不是间断空间

使用difflib比较键入的原始字符串和刮取的原始字符串,突出显示了空格之间的某种差异

将正则表达式更改为识别任何空格字符而不是仅识别“”似乎已经修复了它。新的正则表达式是:

r"(\s*Dase\s*por\s*designad[o]?[a]?)"

由于某些原因,保留单个\s无法修复此问题,必须将其设置为多个,才能进行可能的匹配。作为快速修复,我使用的是0到无限,你可能想考虑改变它。

相关问题 更多 >