我正在尝试使用BeautifulSoup处理从在线网站提取的html数据。我创建了一个类“网站”,它具有几个函数,这些函数根据实例变量(例如标头,类等)为我的目标文本解析html脚本。例如
class Websites:
def __init__(self, url, header, class_):
self.url = url
self.header = header
self.class_ = class_
def html(self):
url = self.url
webpage = urlopen(url)
page_html = webpage.read()
webpage.close()
page_soup = bs(page_html, 'html.parser')
return page_soup
将这些变量(标头,类)转换为类中的实例变量很简单,但是我正在努力将其中一个变量转换为类实例变量。我相信在BeautifulSoup术语中,它被称为“标签”。如果在类的实例上调用上面显示的html函数,则会得到一块html文本,可以将其保存为变量(page_soup),可以在其中添加标签,例如像这样:
page_soup.div.h1.p
这指定了我要访问的html脚本的确切部分。有什么办法可以修改上面显示的类 init 函数,使其可以接受输入,例如:
amazon = Websites(url = 'Amazon.co.uk', tag = '.div.h1.p')
将其用作self.tag中的类方法中的实例变量?
答案 0 :(得分:0)
以这种方式访问标签与使用BeautifulSoup的find()
函数相同,该函数返回第一个匹配的标签。因此,您可以编写自己的函数来模拟这种方法,如下所示:
from bs4 import BeautifulSoup
def get_tag(tag, text_attr):
for attr in text_attr.split('.'):
if attr:
tag = tag.find(attr)
return tag
html = """<html><h2>test1</h2><div><h1>test2<p>display this</p></h1></div></html>"""
soup = BeautifulSoup(html, "html.parser")
print(soup.div.h1.p)
print(get_tag(soup, '.div.h1.p'))
这将显示:
<p>display this</p>
<p>display this</p>
另一种方法是使用.select()
函数,该函数返回匹配标签的列表:
print(soup.select('div > h1 > p')[0])