Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对于span标记,来自bs4的get_text()是否不同?无法删除跨度标记_Python_Html_Web Scraping_Beautifulsoup - Fatal编程技术网

Python 对于span标记,来自bs4的get_text()是否不同?无法删除跨度标记

Python 对于span标记,来自bs4的get_text()是否不同?无法删除跨度标记,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,在制作网页刮板时,我能够找到可用的数据刮板。 在两个数据字段上,我可以使用beautifulsoup get_text()从数据中重新生成html 但是当我使用get_text()时,第三个字段将不起作用。我可以让它给我整个span标签,而不是里面的文本 我尝试了不同的迭代来获得相同的数据,它将给我整个跨度标签,即东西 正在尝试将busnumber设置为此span标记内的电话号码 01430422826 我试过了 从bs4导入美化组 导入请求 导入csv 数据列表=[] url='1〕http

在制作网页刮板时,我能够找到可用的数据刮板。 在两个数据字段上,我可以使用beautifulsoup get_text()从数据中重新生成html

但是当我使用get_text()时,第三个字段将不起作用。我可以让它给我整个span标签,而不是里面的文本

我尝试了不同的迭代来获得相同的数据,它将给我整个跨度标签,即东西

正在尝试将busnumber设置为此span标记内的电话号码

01430422826
我试过了

从bs4导入美化组
导入请求
导入csv
数据列表=[]
url='1〕https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
标题={
“用户代理”:“Mozilla/5.0(Macintosh;英特尔Mac OS X 10_11_6)AppleWebKit/537.36(KHTML,如Gecko)Chrome/56.0.2924.87 Safari/537.36”,
}
site=requests.get(url,headers=headers,timeout=5);
如果site.status_代码为200:
content=BeautifulSoup(site.content,'html.parser')
#打印(内容)
问题=内容。查找所有(class='businessCapsule')
有关问题:
busname=question.find(class='businessCapsule--name').get_text()
bustype=question.find(class='businessCapsule--classification').get_text()
busnum=question.find('span',{'itemprop':'telephone'})
打印(busnum)
busnumber=busnum.get_text()
新_数据={“busname”:busname,“bustype”:bustype,“busnumber”:busnumber}
数据列表。追加(新数据)
打开('selector.csv','w')作为文件:
writer=csv.DictWriter(文件,字段名=[“busname”,“bustype”,“busnumber”],分隔符=“;”)
writer.writeheader()
对于数据列表中的行:
writer.writerow(行)
以及

从bs4导入美化组
导入请求
导入csv
数据列表=[]
url='1〕https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
标题={
“用户代理”:“Mozilla/5.0(Macintosh;英特尔Mac OS X 10_11_6)AppleWebKit/537.36(KHTML,如Gecko)Chrome/56.0.2924.87 Safari/537.36”,
}
site=requests.get(url,headers=headers,timeout=5);
如果site.status_代码为200:
content=BeautifulSoup(site.content,'html.parser')
#打印(内容)
问题=内容。查找所有(class='businessCapsule')
有关问题:
busname=question.find(class='businessCapsule--name').get_text()
bustype=question.find(class='businessCapsule--classification').get_text()
busnumber=question.find('span',{'itemprop':'telephone'})
新_数据={“busname”:busname,“bustype”:bustype,“busnumber”:busnumber}
数据列表。追加(新数据)
打开('selector.csv','w')作为文件:
writer=csv.DictWriter(文件,字段名=[“busname”,“bustype”,“busnumber”],分隔符=“;”)
writer.writeheader()
对于数据列表中的行:
writer.writerow(行)
在这两种情况下,get_text()都会出现此错误

Traceback (most recent call last):
  File "webscraper2.py", line 22, in <module>
    busnumber = busnum.get_text()
AttributeError: 'NoneType' object has no attribute 'get_text'

您需要获得不同的父级,以便选择适当的子级并更改子级的选择器,如下所示:

import requests
from bs4 import BeautifulSoup as bs

url = 'https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    }
site = requests.get(url, headers=headers, timeout=5)
soup = bs(site.content, 'lxml')
questions = soup.select('.businessCapsule--mainContent:has(span.business--telephoneNumber)')
for question in questions:
    print(question.select_one('span.business--telephoneNumber').text)
如果您选中此不同的父选择器,您将看到它选择了包含信息的整个框,以便您可以选择您的各个子项

如果这太麻烦,你可以测试一下电话是否存在

import requests
from bs4 import BeautifulSoup as bs

url = 'https://www.yell.com/ucs/UcsSearchAction.do?keywords=farmer&location=leeds'
headers = {
        'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
    }
site = requests.get(url, headers=headers, timeout=5)
soup = bs(site.content, 'lxml')
questions = soup.select('.businessCapsule--mainContent')
for question in questions:
    tel = question.select_one('span.business--telephoneNumber')
    if tel is None:
        tel = 'Not present'
    else:
        tel = tel.text
    print(tel)

你的例子不是一个完整的最小的,可复制的例子。因为代码和输入数据都丢失了。请看这里:但是我猜
question.find('span',{'itemprop':'telephone')
在某个迭代中不返回任何值,但我不知道您在迭代什么,因为我不知道问题包含什么。抱歉,它说不能粘贴完整的代码,我已经将代码编辑到了完整的页面:数据可以去除跨度,但仍然会产生相同的错误<代码>01430 422826回溯(最后一次调用):文件“webscraper2.py”,第20行,在busnumber=question中。选择一个('.business--telephoneNumber')。get_text()AttributeError:'NoneType'对象没有属性“get_text”尽管正在删除span标记,但出于某种原因它仍然会给出相同的错误<代码>0113 286 6060 0113 256 9027 0113 281 3009 01430 422826回溯(最后一次通话):文件“webscraper2.py”,第16行,在busnumber=question中。选择一个('span.business--telephoneNumber')).text AttributeError:'NoneType'对象没有属性'text'过了一会儿,我已经在原始问题的底部上传了完整的新代码,如果有帮助的话?我是不是在做别的事情?同时感谢您的帮助:我已编辑为仅为那些使用bs4.7.1的电话号码的列表选择。