Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python从BeautifulSoup打印多个值_Python_Beautifulsoup - Fatal编程技术网

如何使用Python从BeautifulSoup打印多个值

如何使用Python从BeautifulSoup打印多个值,python,beautifulsoup,Python,Beautifulsoup,我正在尝试使用BeautifulSoup从网页中获取两个值。仅打印一个值时,内容看起来不错。但是,当打印两个值(到同一行)时,html代码将围绕其中一个值显示 这是我的密码: from bs4 import BeautifulSoup import urllib.request as urllib2 list_open = open("source.txt") read_list = list_open.read() line_in_list = read_list.split("\n")

我正在尝试使用BeautifulSoup从网页中获取两个值。仅打印一个值时,内容看起来不错。但是,当打印两个值(到同一行)时,html代码将围绕其中一个值显示

这是我的密码:

from bs4 import BeautifulSoup
import urllib.request as urllib2


list_open = open("source.txt")
read_list = list_open.read()
line_in_list = read_list.split("\n")


i = 0
for url in line_in_list:
    soup = BeautifulSoup(urllib2.urlopen(url).read(), 'html.parser')
    sku = soup.find_all(attrs={'class': "identifier"})
    description = soup.find_all(attrs={'class': "description"})
    for text in description:
        print((sku), text.getText())
    i += 1
输出如下所示:

[<span class="identifier">112404</span>] A natural for...etc
[<span class="identifier">110027</span>] After what...etc
[<span class="identifier">03BA5730</span>] Argentina is know...etc
[<span class="identifier">090030</span>] To be carried...etc
sku = soup.find_all(attrs={'class': "identifier"})
description = soup.find_all(attrs={'class': "description"})
print(sku[0].get_text(), description[0].get_text())
[112404]自然的……等
[110027]什么之后……等等
[03BA5730]阿根廷知道……等等
[090030]待运……等
输出最好不包含数字周围的
[
-内容


我猜问题出在最后一个for循环中,但我不知道如何更正。非常感谢所有帮助。谢谢!-Espen

看起来您需要
zip()
标识符和描述,并为循环中找到的每个标记调用
getText()

identifiers = soup.find_all(attrs={'class': "identifier"})
descriptions = soup.find_all(attrs={'class': "description"})

for identifier, description in zip(identifiers, descriptions):
    print(identifier.getText(), description.getText())
find_all()
返回一个
ResultSet
,这或多或少是一个奇特的列表。打印
ResultSet
将包括通常表示列表的左右方括号,并且项目(标记)将显示在其中

您的示例输出表明,每个URL的HTML包含一个SKU和每个URL的一个描述。如果这是正确的,那么您的代码可以在每个
结果集中选择第一项,如下所示:

[<span class="identifier">112404</span>] A natural for...etc
[<span class="identifier">110027</span>] After what...etc
[<span class="identifier">03BA5730</span>] Argentina is know...etc
[<span class="identifier">090030</span>] To be carried...etc
sku = soup.find_all(attrs={'class': "identifier"})
description = soup.find_all(attrs={'class': "description"})
print(sku[0].get_text(), description[0].get_text())
或者,您可以使用
find()
,找到每一项的第一项:

但是,您的代码表明每个SKU可以有多个描述,因为您正在迭代描述结果集。也许每页可以有多个SKU和描述(在这种情况下,请参见)?很难判断


如果您可以通过添加实时URL或示例HTML更新您的问题,我们可以提供更好的建议。

谢谢@mhawke。每个sku只有一个描述,两种解决方案在我的案例中都有效。