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