bs4选择器不接受“图片:标题"

2024-06-25 23:42:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在做一个网站刮刀,让我在一个网站上的所有产品名称。当我试图定位产品的标题时,我总是遇到一个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'

Tags: httpsimageurldatatitle网站sessionitems
2条回答

最好的选择是使用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

那不是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)

相关问题 更多 >