bs4选择器未拍摄“图像:标题”

问题描述 投票:0回答:2

我正在制作网站刮刀,以便在网站上获取所有产品名称。在尝试找到产品的标题时,我不断收到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'
python web-scraping beautifulsoup
2个回答
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)

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
© www.soinside.com 2019 - 2024. All rights reserved.