我正在制作网站刮刀,以便在网站上获取所有产品名称。在尝试找到产品的标题时,我不断收到KeyError。
HTML:
<url>
<loc>
https://shop.havenshop.ca/products/cassady-sunglasses-indigo-gunmetal
</loc>
<lastmod>2017-10-19T08:53:44-07:00</lastmod>
<changefreq>daily</changefreq>
<image:image>
<image:loc> https://cdn.shopify.com/s/files/1/0051/7042/products/Cassady_SunglassesIndigoGunmetal1.jpg?v=1436564480</image:loc>
<image:title>"Cassady" Sunglasses Indigo / Gunmetal</image:title>
</image:image>
</url>
Python代码:
session = requests.session()
sitemap = session.get(link)
data = sitemap.text
soup = BeautifulSoup(data, "lxml")
items = soup.find_all("url")
for i in range(len(items)):
for item in items[i]:
print items[i]["image:image"]["image:title"]
错误:
KeyError: 'image:title'
答案 0 :(得分:1)
这不是HTML,即XML。您应该找到命名空间元素,而不是尝试通过属性访问。这将为您提供价值:
items[i].find('image.title')
一个完整的例子:
for url in soup.find_all('url'):
if 'Cassady' in url.find('image:title').text:
print(url.find('image:loc').text)
答案 1 :(得分:0)
最佳选择是使用bs4解决方案:
只是一个意见:
如果您只想要所有产品名称,那么您也可以使用正则表达式:
import re
pattern=r'<image:title>"(\w.+?)<\/image:title>'
with open('file.txt','r') as f: #instead of file you can directly pass the url content via bs4 parser
match=re.finditer(pattern,f.read())
for i in match:
print(i.group(1))
输出:
Cassady" Sunglasses Indigo / Gunmetal