如何在BeautifulSoup中添加html'path'(tag)作为python中的类实例变量?

时间:2019-03-14 18:04:11

标签: python html beautifulsoup

我正在尝试使用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中的类方法中的实例变量?

1 个答案:

答案 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])