我正在尝试使用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
输出最好不要有[<span class="identifier">
- 数字周围的东西......
我猜这个问题出现在最后一个for循环中,但我不知道如何纠正它。所有帮助表示赞赏。谢谢! -Espen
答案 0 :(得分:1)
您似乎需要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())
答案 1 :(得分:1)
find_all()
会返回ResultSet
,这或多或少是一个花哨的列表。打印ResultSet
将包括左右方括号,通常表示列表,项目(标签)将显示在其中。
您的示例输出表明每个网址的HTML包含一个SKU,每个网址包含一个描述。如果这是正确的,那么您的代码可以选择每个ResultSet
中的第一项,如下所示:
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 = soup.find(attrs={'class': "identifier"})
description = soup.find(attrs={'class': "description"})
print(sku.get_text(), description.get_text())
但是,您的代码表明每个SKU可能有多个描述,因为您正在迭代描述结果集。也许每页可以有多个SKU和描述(在这种情况下请参阅@alecxe's answer)?这很难说。
如果您可以通过添加实时网址或示例HTML来更新您的问题,我们可以提供更好的建议。