【发布时间】: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)))
标签: python regex web-scraping beautifulsoup