.text 在 BeautifulSoup 中被数字和特殊键打乱

Posted

技术标签:

【中文标题】.text 在 BeautifulSoup 中被数字和特殊键打乱【英文标题】:.text is scrambled with numbers and special keys in BeautifuSoup 【发布时间】:2018-08-27 12:53:38 【问题描述】:

您好,我目前正在使用 Python 3、BeautifulSoup 4,并且请求从supremenewyork.com UK 抓取一些信息。我已经在脚本中实现了一个代理脚本(我知道它有效)。唯一的问题是这个网站不喜欢自动抓取这些信息的程序,所以他们决定打乱这个脚本,我认为这使它无法作为文本使用。

我的问题:有没有办法在不使用 .text 的情况下获取文本和/或有没有办法让脚本读取文本?当它看到像# 这样的特殊字符时跳过它或在看到& 时阅读文本时跳过直到看到;

因为基本上这个网站是如何打乱文本的。这是一个示例,当您检查元素时显示的文本是:

supremetshirt

应该说“至高无上的T恤”等等(你明白了,他们不使用字母来打乱数字和特殊键)

当您在 UK Supreme 网站上使用 *** 检查元素时,此 会自动在框中突出显示,并且与文本不同(根本没有突出显示)。每当我在本地 supremenewyork.com 上运行没有代理代码的脚本时,它都可以正常工作(但只是因为代码,而不是在我的本地网站上被打乱,我想从英国网站上提取此信息)有什么想法吗?这是我的代码:

import requests
from bs4 import BeautifulSoup

categorys = ['jackets', 'shirts', 'tops_sweaters', 'sweatshirts', 'pants', 'shorts', 't-shirts', 'hats', 'bags', 'accessories', 'shoes', 'skate']
catNumb = 0

#use new proxy every so often for testing (will add something that pulls proxys and usses them for you.
UK_Proxy1 = '51.143.153.167:80'

proxies = 
   'http': 'http://' + UK_Proxy1 + '',
   'https': 'https://' + UK_Proxy1 + '',


for cat in categorys:
    catStr = str(categorys[catNumb])
    cUrl = 'http://www.supremenewyork.com/shop/all/' + catStr
    proxy_script = requests.get(cUrl, proxies=proxies).text
    bSoup = BeautifulSoup(proxy_script, 'lxml')
    print('\n*******************"'+ catStr.upper() + '"*******************\n')
    catNumb += 1
    for item in bSoup.find_all('div', class_='inner-article'):
        url = item.a['href']
        alt = item.find('img')['alt']
        req = requests.get('http://www.supremenewyork.com' + url)
        item_soup = BeautifulSoup(req.text, 'lxml')
        name = item_soup.find('h1', itemprop='name').text
        #name = item_soup.find('h1', itemprop='name')
        style = item_soup.find('p', itemprop='model').text
        #style = item_soup.find('p', itemprop='model')
        print (alt +(' --- ')+ name +(' --- ')+ style)
        #print(alt)
        #print(str(name))
        #print (str(style))

当我运行这个脚本时,我得到了这个错误:

name = item_soup.find('h1', itemprop='name').text AttributeError: 'NoneType' 对象没有属性 'text'

所以我所做的是我对上面带有哈希标记的内容进行了哈希标记,并对其他相似但不同的内容进行哈希标记,我得到了某种str 错误,所以我尝试了print(str(name))。我可以很好地打印 alt(对于每个脚本,alt 都不会被打乱),但是在打印名称和样式时,它打印的只是在每个 alt 代码下打印的 None

我这几天一直在努力解决这个问题,但没有提出任何解决方案。谁能帮我解决这个问题?

【问题讨论】:

【参考方案1】:

我已经使用这个解决方案解决了我自己的答案:

thetable = soup5.find('div', class_='turbolink_scroller')
items = thetable.find_all('div', class_='inner-article')
for item in items:
    alt = item.find('img')['alt']
    name = item.h1.a.text
    color = item.p.a.text
    print(alt,' --- ', name, ' --- ',color)

【讨论】:

以上是关于.text 在 BeautifulSoup 中被数字和特殊键打乱的主要内容,如果未能解决你的问题,请参考以下文章

.string 和 .text BeautifulSoup 之间的区别

beautifulsoup .get_text() 对我的 HTML 解析不够具体

BeautifulSoup .text 方法返回不带分隔符的文本(\n、\r 等)

BeautifulSoup:从 html 获取 css 类

如何用 Beautifulsoup 解析“数据文本”? [复制]

Python库-BeautifulSoup