在 Python 中抓取包含某些字符和名称的文本?

Scraping text containing certain caracters and names in Python?

提问人:Tobias Simonsen 提问时间:10/18/2021 最后编辑:Tobias Simonsen 更新时间:10/18/2021 访问量:106

问:

我对 python 相当陌生,并且正在从事一个项目,在这个项目中,我需要在一堆文章中引用某些人的所有报价。

对于这个问题,我以这篇文章为例:https://www.theguardian.com/us-news/2021/oct/17/jeffrey-clark-scrutiny-trump-election-subversion-scheme

现在,使用 Lambda,我能够使用以下代码抓取包含我正在寻找的人的姓名的文本:

import requests
from bs4 import BeautifulSoup
url = 'https://www.theguardian.com/us-news/2021/oct/17/jeffrey-clark-scrutiny-trump-election-subversion-scheme'
response = requests.get(url)
data=response.text
soup=BeautifulSoup(data,'html.parser')
tags=soup.find_all('p')
words = ["Michael Bromwich"]
for tag in tags:
    quotes=soup.find("p",{"class":"dcr-s23rjr"}, text=lambda text: text and any(x in text for x in words)).text

print(quotes)

...它返回包含“Michael Bromwich”的文本块,在本例中,它实际上是文章中的引用。但是当抓取 100+ 篇文章时,这并不能完成这项工作,因为其他文本块也可能包含指示的名称而不包含引号。我只想要包含引号的文本字符串。

因此,我的问题:是否可以在以下条件下打印所有 HTML 字符串:

文本 STARTS with the caracter “ (引号) OR - (连字符) 并包含名称“Michael Bromwich”或“John Johnson”等。

谢谢!

Python 正则表达式 lambda beautifulsoup 行情

评论

0赞 Wiktor Stribiżew 10/18/2021
我认为你在这里不需要正则表达式,应该这样做。引号总是卷曲的吗?或者您需要支持任何类型的引号吗?连字符也一样:你需要支持任何类型的破折号吗?soup.find("p",{"class":"dcr-s23rjr"}, text=lambda t: t and (t.startswith("“") or t.startswith("-")) and any(x in t for x in words)).text
0赞 Tobias Simonsen 10/18/2021
这样就可以了!谢谢。但它并不总是卷曲的引号,不。如何区分直引号和 t.startswith(“”“) 中的其他两个引号?
0赞 Wiktor Stribiżew 10/18/2021
看看我的回答,还有一种方法可以将这个检查缩短为 .如果您需要添加其他引号,请将它们添加为t.strip()[0] in '“"-'t.strip()[0] in '''“"'‘-'''

答:

0赞 Wiktor Stribiżew 10/18/2021 #1

首先,你不需要循环,你只需要根据你的条件使用。for tag in tagssoup.find_all

接下来,您可以检查没有任何正则表达式的引号或连字符:

quotes = [x.text for x in  soup.find_all("p",{"class":"dcr-s23rjr"}, text=lambda t: t and (t.startswith("“") or t.startswith('"') or t.startswith("-")) and any(x in t for x in words))]

该部件将检查文本是否以 或 开头。(t.startswith("“") or t.startswith('"') or t.startswith("-"))"-

quotes = [x.text for x in  soup.find_all("p",{"class":"dcr-s23rjr"}, text=lambda t: t and t.strip()[0] in '“"-' and any(x in t for x in words))]

该部件检查 是否包含剥离文本值的第一个字符。t.strip()[0] in '“"-'“"-