Beautiful Soup 中 find_all 方法的返回类型是啥?
Posted
技术标签:
【中文标题】Beautiful Soup 中 find_all 方法的返回类型是啥?【英文标题】:What is the return type of the find_all method in Beautiful Soup?Beautiful Soup 中 find_all 方法的返回类型是什么? 【发布时间】:2020-06-06 03:20:42 【问题描述】:from bs4 import BeautifulSoup, SoupStrainer
from urllib.request import urlopen
import pandas as pd
import numpy as np
import re
import csv
import ssl
import json
from googlesearch import search
from queue import Queue
import re
links = []
menu = []
filtered_menu = []
def contains(substring, string):
if substring.lower() in string.lower():
return True
else:
return False
for website in search("mr puffs", tld="com", num=1, stop=1, country="canada", pause=4):
links.append(website)
soup = BeautifulSoup(urlopen(links.pop(0)), features="html.parser")
menu = soup.find_all('a', href=True)
for string in menu:
if contains("contact", string):
filtered_menu.append(string)
print(filtered_menu)
我正在创建一个网络爬虫,它将从网站中提取联系信息。但是,为了做到这一点,我需要访问网站的联系页面。使用 googlesearch 库,代码搜索关键字并将所有结果(达到一定限制)放在一个列表中。为简单起见,在此代码中,我们只是放入第一个链接。现在,从这个链接,我正在创建一个漂亮的汤对象,我正在提取网站上的所有其他链接(因为通常在主页上找不到联系信息)。我将这些链接放在一个名为 menu 的列表中。
现在,我想过滤菜单中仅包含“联系人”的链接。示例:“www.smallBusiness.com/our-services”将从新列表中删除,而“www.smallBusiness.com/contact”或“www.smallBusiness.com/contact-us”将保留在列表中。
我定义了一个检查子字符串是否在字符串中的方法。但是,我得到以下异常:
TypeError: 'NoneType' 对象不可调用。
我尝试通过 re.search 使用正则表达式,但它说预期的字符串类型或类似字节的值不在参数中。
我认为这是因为 find_all 的返回类型不是字符串。这可能是我在文档中找不到的其他内容。如果是这样,如何将其转换为字符串?
根据以下答案的要求,以下是打印菜单列表给出的内容:
从这里,我只想提取突出显示的链接:
【问题讨论】:
您可以随时使用print(type(some_var))
找出变量的类型(在这种情况下为print(type(menu))
)
【参考方案1】:
BeautifulSoup.find_all()
类型为bs4.element.ResultSet
(实际上是一个列表)
find_all()
的各个项目,在您的情况下,您调用的变量"string"
的类型为bs4.element.Tag
。
正如您的 contains
函数所期望的 type str
一样,您的 for 循环应该类似于:
for string in menu:
if contains("contact", str(string)):
filtered_menu.append(string)
【讨论】:
哇,这行得通,我之前尝试将该方法转换为字符串,但它没有用。我在 menu = str(soup.find_all('a', href=True) 之前做过这个【参考方案2】:这就是我在 google 中搜索用户输入的搜索词,然后从 serps 中抓取所有 url 的方法。该程序继续直接访问这些链接中的每一个,并从这些链接中删除文本。
也许您可以根据自己的目的进行修改?
#First-stage scrape of Google
headers = "user-agent": USER_AGENT
URL=f"https://google.com/search?q=squery"
URL2=f"https://google.com/search?q=squery2"
URL3=f"https://google.com/search?q=squery3"
URL4=f"https://google.com/search?q=squery4"
resp=requests.get(URL, headers=headers)
resp2=requests.get(URL2, headers=headers)
resp3=requests.get(URL3, headers=headers)
resp4=requests.get(URL4, headers=headers)
results=[]
s2results=[]
s3results=[]
s4results=[]
def scrapeURL(a,b,c):
if a.status_code == 200:
print("Searching Google for information about: ", c)
soup = BeautifulSoup(a.content, "html.parser")
for g in soup.find_all('div', class_='r'):
anchors = g.find_all('a')
if anchors:
link = anchors[0]['href']
title = g.find('h3').text
item =
link
b.append(item)
else:
print("Couldn't scrape URLS from first phase")
else:
print("Could not perform search. Status code: ",a.status_code)
#Create list of urls and format to enable second scrape
scrapeURL(resp,results,query)
scrapeURL(resp2,s2results,query2)
scrapeURL(resp3,s3results,query3)
scrapeURL(resp4,s4results,query4)
#Create list of urls and format to enable second scrape
def formaturls(res,resstorage):
a=0
listurls=str(res)
listurls=listurls.replace("[","")
listurls=listurls.replace("","")
listurls=listurls.replace("'","")
listurls=listurls.replace("]","")
listurls=listurls.lower()
re=listurls.split(",")
for items in re:
s=str(re[a])
resstorage.append(s)
a=a+1
qresults=[]
q2results=[]
q3results=[]
q4results=[]
formaturls(results,qresults)
formaturls(s2results,q2results)
formaturls(s3results,q3results)
formaturls(s4results,q4results)
【讨论】:
我把图片放在上面 我有一个与您正在尝试做的类似的刮板。让我跳上电脑给你贴代码 你去。通常我会尝试直接回答您的问题,但我感觉不舒服,这应该是相当适应的,所以我试图提供帮助。 谢谢!抱歉,我现在无法投票,因为我的声望点少于 15。但我一到那里就会投赞成票 代表无关紧要。我发布了一个“你们真聪明”的问题,这不是情人节那天的问题,它被投票删除,从那以后我不能在这里提问。我只是在可能的时候回答,因为有时能得到帮助是件好事。以上是关于Beautiful Soup 中 find_all 方法的返回类型是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Python爬虫编程思想(55):Beautiful Soup方法选择器之find_all方法