Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.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中的web抓取-从两个嵌套级别中的任意一个检索文本_Python_Html_Web Scraping_Beautifulsoup - Fatal编程技术网

python中的web抓取-从两个嵌套级别中的任意一个检索文本

python中的web抓取-从两个嵌套级别中的任意一个检索文本,python,html,web-scraping,beautifulsoup,Python,Html,Web Scraping,Beautifulsoup,我正在使用python中的BeautifulSoup从一个网站检索信息,比如 我正在尝试检索关于职位公告“位置”的信息,这些信息可以在嵌套html的两个级别之一找到 有时,我想要的文本在带有(name=“span”,attrs={“class”:“location”})的标记中 有时,我想要的文本位于另一个标记(name='span',attrs={“itemprop”:“addressLocality”})中,该标记嵌套在上面的第一个标记中 我正在尝试编写一个循环,检查我想要的位置文本(例如,

我正在使用python中的BeautifulSoup从一个网站检索信息,比如

我正在尝试检索关于职位公告“位置”的信息,这些信息可以在嵌套html的两个级别之一找到

有时,我想要的文本在带有(name=“span”,attrs={“class”:“location”})的标记中

有时,我想要的文本位于另一个标记(name='span',attrs={“itemprop”:“addressLocality”})中,该标记嵌套在上面的第一个标记中

我正在尝试编写一个循环,检查我想要的位置文本(例如,“New York,NY”)是否在第一个标记内,如果不在,则从第二个标记检索它

目前,我能想到的最好办法是:

for item in soup.find_all(name='span', attrs={"class":"location"}):
    print(item.renderContents())
然而,这给了我以下不希望的输出:

New York, NY 10001
New York, NY
New York, NY 10154
<span itemprop="addressLocality">New York, NY</span>
<span itemprop="addressLocality">New York, NY</span>
<span itemprop="addressLocality">New York, NY</span>
<span itemprop="addressLocality">New York, NY</span>
<span itemprop="addressLocality">New York, NY</span>
<span itemprop="addressLocality">New York, NY 10016 <span style="font-size: smaller">(Gramercy area)</span></span>
<span itemprop="addressLocality">New York, NY</span>
<span itemprop="addressLocality">Manhattan, NY</span>
<span itemprop="addressLocality">New York, NY</span>
<span itemprop="addressLocality">New York, NY 10016 <span style="font-size: smaller">(Gramercy area)</span></span>
New York, NY
New York, NY 10154
纽约州纽约市,邮编10001 纽约州纽约市 纽约州纽约市10154 纽约州纽约市 纽约州纽约市 纽约州纽约市 纽约州纽约市 纽约州纽约市 纽约州纽约市,邮编10016(格拉梅西地区) 纽约州纽约市 纽约曼哈顿 纽约州纽约市 纽约州纽约市,邮编10016(格拉梅西地区) 纽约州纽约市 纽约州纽约市10154 理想情况下,我希望所有正常显示的文本保持原样,并从其他结果中去掉“span itemprop=“addressLocality”等。我试着写了一些try/except语句来实现这一点,但没有任何效果

我可以将整个内容保存到一个列表中,并编写单独的代码来删除这些额外的繁重文本,但我希望在最初的检索中能够以一种更优雅的方式完成这项工作


有人能帮我吗?谢谢您的考虑

如果您可以通过
class=location
仅获取
span
(并假设这些正是您想要在文档中显示的项目),则无论是否嵌套,它们都包含相同的
文本

>>> from bs4 import BeautifulSoup
>>> soup = BeautifulSoup('<span class="location" itemprop="address" itemscope itemtype="http://schema.org/Postaladdress"><span itemprop="addressLocality">New York, NY</span></span>', 'lxml')
>>> soup.text
'New York, NY'
>>> soup = BeautifulSoup('<span class=location>New York, NY</span>', 'lxml')
>>> soup.text
'New York, NY'

您好,这确实有点帮助,但我希望生成一个完整的位置列表,就像上面的原始输出一样,除了没有任何添加的html标记(例如)。你会知道更多关于这件事吗?哇,谢谢-这很有效!看起来很容易,但我还是有点困惑。“for span in span:span.text”实际上是否打印顶级span标记或任何后续嵌套标记中出现的任何文本?再次感谢您,这真是太棒了。span中span的
只需迭代上一行中找到的
soup
集合。没什么特别的。下一行中的
.text
将拾取
span
中的所有文本(这只是项目列表中的一个项目,可能有任何名称),以便对其进行处理。在您的例子中,有时
span
包含未修饰的
,有时包含嵌套的
。没关系,你还是会得到随附的文本。事实上,如果
span
包含类似
的内容,您仍然可以得到其中的任何文本。您甚至可能会得到一些文本项。非常好-再次感谢您提供的有用解释=)
>>> import requests
>>> from bs4 import BeautifulSoup
>>> URL = 'https://www.indeed.com/jobs?q=data%20scientist%20$20,000&l=New%20York&start=10/'
>>> page = requests.get(URL).text
>>> soup = BeautifulSoup(page, 'lxml')
>>> spans = soup.findAll('span', attrs={'class': 'location'})
>>> for span in spans:
...     span.text
...     
'New York, NY 10154'
'New York, NY 10003'
'New York, NY'
'New York, NY'
'New York, NY'
'New York, NY'
'New York, NY'
'New York, NY'
'New York, NY'
'New York, NY'
'New York, NY'
'New York, NY'
'New York, NY 10018 (Clinton area)'
'New York, NY'
'New York, NY 10001'