多个findAll合而为一

时间:2019-02-10 16:49:09

标签: python python-3.x web-scraping beautifulsoup

我正在使用BeatufulSoap从网页读取一些数据。 这段代码可以正常工作,但是我想对其进行改进。

如何使for循环在每次迭代中提取多个数据?在这里,我有3个for循环从中获取值:

for elem in bsObj.findAll('div', class_="grad"): ...
for elem in bsObj.findAll('div', class_="ulica"): ...
for elem in bsObj.findAll('div', class_="kada"): ...

如何将其更改为在一个for循环中工作?当然,我想要一个简单的解决方案。 输出可以是列表

到目前为止我的代码

from bs4 import BeautifulSoup

# get data from a web page into the ``html`` varaible here

bsObj = BeautifulSoup(html.read(),'lxml')

mj=[]
adr=[]
vri=[]

for mjesto in bsObj.findAll('div', class_="grad"):
    print (mjesto.get_text())
    mj.append(mjesto.get_text())


for adresa in bsObj.findAll('div', class_="ulica"):
    print (adresa.get_text())
    adr.append(adresa.get_text())


for vrijeme in bsObj.findAll('div', class_="kada"):
    print (vrijeme.get_text())
    vri.append(vrijeme.get_text())

2 个答案:

答案 0 :(得分:1)

您可以使用BeautifulSoup的echo方法来定位各种所需元素,并对它们进行任何操作。在这种情况下,我们将使用select伪类来简化CSS选择器模式,但是基本上,我们正在搜索具有类:is()div的任何gradulica。当返回与模式匹配的每个元素时,我们只需按照它们对应的类对其进行排序:

kada

答案 1 :(得分:0)

注:前面的基本解释。如果您知道这一点,请直接跳到可能性列表中

要将代码更改为循环,必须查看保持不变的部分和变化的部分。对于您的情况,您找到了div,获取了文本并将其附加到列表中。

class对象的div属性每次都不同,因此您追加到的列表也不同。 for循环的工作原理是,为每个迭代赋予一个变量不同的值,然后执行其中的代码。

我们得到一个基本结构:

for div_class in <div classes>:
    <stuff to do>

现在,在<stuff to do>中,每次都有一个不同的列表。我们需要某种方法将其他列表放入循环中。为此,有多种可能性:

  • 将列表放入dict中并使用项目查找
  • zip中带有<div classes>的列表并对其进行迭代

前两个将涉及使用嵌套循环,结果类似于此:

list_1 = []
list_2 = []
list_3 = []
for div_class, the_list in zip(['div_cls1', 'div_cls2', 'div_cls3'], [list_1, list_2, list_3]):
    for elem in bsObj.find_all('div', class_=div_class):
        the_list.append(elem.get_text())

lists = {'div_cls1': [], 'div_cls2': [], 'div_cls3': []}
for div_class in lists:  # note: keys MUST match the class of div elements
    for elem in bsObj.find_all('div', class_=div_class):
        lists[div_class].append(elem.get_text)

当然,内部循环可以由列表理解代替(适用于dict方法):lists[div_class] = [elem.get_text() for elem in bsObj.find_all('div', class_=div_class)]