Python 如何使用BS4搜索特定的单词,然后在该单词之后立即获取同一元素中的文本?
我对BeautifulSoup和Python非常陌生。我在一些网页上爬行,有时候有电话号码,有时候没有。如果它在那里,我想刮它。HTML非常简单:Python 如何使用BS4搜索特定的单词,然后在该单词之后立即获取同一元素中的文本?,python,web-scraping,beautifulsoup,Python,Web Scraping,Beautifulsoup,我对BeautifulSoup和Python非常陌生。我在一些网页上爬行,有时候有电话号码,有时候没有。如果它在那里,我想刮它。HTML非常简单: <div> <p>Email: someone@somewhere.com</p> <p>Telephone: 1234567890</p> <p>Postal code: B3H 2F5</p> </div> 在这个div中通
<div>
<p>Email: someone@somewhere.com</p>
<p>Telephone: 1234567890</p>
<p>Postal code: B3H 2F5</p>
</div>
在这个div中通常有几个其他的p标记,但是不总是有相同的p标记,所以我不能依赖它们作为参考点。电话号码也不总是遵循相同的模式。我所能做的最好的事情就是确定电话号码的前面总是加上“Telephone:”并用一个p标签包装起来。这似乎是找到它的唯一可靠方法
我不明白的是如何获得实际的电话号码,即,标签中“电话:”之后的任何内容
如何在单词“Telephone:”后获取此元素中的数字?通过一些正则表达式逻辑,您可以直接找到包含电话号码的
标记:
import re
from bs4 import BeautifulSoup
html = """<div>
<p>Email: someone@somewhere.com</p>
<p></p>
<p>Postal code: B3H 2F5</p>
<p>Telephone: 1234567890</p>
</div>"""
soup = BeautifulSoup(html)
#Find the tag containing "Telephone:"
phone_tag = soup.find('p', text=re.compile('Telephone:'))
if phone_tag:
phone = phone_tag.text.replace('Telephone:','').strip()
else:
phone = None
重新导入
从bs4导入BeautifulSoup
html=”“”
电邮:someone@somewhere.com
邮政编码:B3H 2F5
电话:1234567890
"""
soup=BeautifulSoup(html)
#查找包含“电话:”的标签:
phone_tag=soup.find('p',text=re.compile('Telephone:'))
如果是电话标签:
phone=phone_tag.text.replace('phone:','').strip()
其他:
电话=无
事实证明,我不知道使用re.compile
搜索此字符串的更好方法。我会把答案贴在这里,以防其他人也在寻找同样的答案
对我起作用的是:
phoneNumber = soup.find('p', text = re.compile('Telephone:'))
这给了我字符串出现的整个p标记,这是我起初没有意识到的,因此我可以做:
if phoneNumber:
phoneNumber = phoneNumber.get_text().strip().replace('Telephone:', '')
else:
phoneNumber = ('None')
如果它的前面总是有:,你可以做一个
str.split(':')[1]
来获取电话号码。这就是为什么有try/except
,否则根据length@sushanth事实上,它前面总是有一个:
,但是如果我这样做phoneNumber=str.split(':')[1]
它总是返回None
@MBWD,对我来说很好对于soup中的p.find(“div”).find_all(“p”):print(p.text.split(“:”)
@sushanth我需要将变量phoneNumber分配给这些号码,如果这些号码存在于页面上,这样它就可以包含在JSON转储中,而不仅仅是打印出来。此外,有时p
标记的顺序与上面显示的不同,因此我需要通过单词“电话:”进行搜索。
if phoneNumber:
phoneNumber = phoneNumber.get_text().strip().replace('Telephone:', '')
else:
phoneNumber = ('None')