Python beautifulsoup无标识符提取值
我正面临一个问题,不知道如何妥善解决它。 我想提取价格(在第一个例子中是130欧元,在第二个例子中是130欧元) 问题是属性一直在变化。所以我不能这样做,因为我正在抓取数百个站点,每个站点上“id”属性的前2个字符可能不同:Python beautifulsoup无标识符提取值,python,regex,beautifulsoup,Python,Regex,Beautifulsoup,我正面临一个问题,不知道如何妥善解决它。 我想提取价格(在第一个例子中是130欧元,在第二个例子中是130欧元) 问题是属性一直在变化。所以我不能这样做,因为我正在抓取数百个站点,每个站点上“id”属性的前2个字符可能不同: tag = soup_expose_html.find('span', attrs={'id' : re.compile(r'(07_content$)')}) 即使我会使用这样的东西,它也不会起作用,因为它与价格没有联系,我可能会得到一些其他价值: tag =
tag = soup_expose_html.find('span', attrs={'id' : re.compile(r'(07_content$)')})
即使我会使用这样的东西,它也不会起作用,因为它与价格没有联系,我可能会得到一些其他价值:
tag = soup_expose_html.find('span', attrs={'id' : re.compile(r'([0-9]{2}_content$)')})
html代码示例:
<span id="07_lbl" class="lbl">Price:</span>
<span id="07_content" class="content">130 €</span>
<span id="08_lbl" class="lbl">Value:</span>
<span id="08_content" class="content">90000 €</span>
<span id="03_lbl" class="lbl">Price:</span>
<span id="03_content" class="content">130 €</span>
<span id="04_lbl" class="lbl">Value:</span>
<span id="04_content" class="content">90000 €</span>
价格:
130 €
价值:
90000 €
价格:
130 €
价值:
90000 €
目前我唯一能想到的是用“text='price:'”之类的东西标识价格标签,然后获取
。next_sibling
并提取字符串。但我不确定是否有更好的方法。有什么建议吗?:-) 试试靓汤选择功能。它使用css选择器:
for span in soup_expose_html.select("span[id$=_content]"):
print span.text
结果是一个包含所有跨度的列表,其id以_contentTry函数结尾。它使用css选择器:
for span in soup_expose_html.select("span[id$=_content]"):
print span.text
结果是一个包含所有跨度的列表,其id以_content结尾,那么
findAll
解决方案如何?首先收集所有可能的id前缀,然后迭代它们并获取所有元素
>>> from bs4 import BeautifulSoup
>>> import re
>>> html = """
... <span id="07_lbl" class="lbl">Price:</span>
... <span id="07_content" class="content">130 €</span>
... <span id="08_lbl" class="lbl">Value:</span>
... <span id="08_content" class="content">90000 €</span>
...
...
... <span id="03_lbl" class="lbl">Price:</span>
... <span id="03_content" class="content">130 €</span>
... <span id="04_lbl" class="lbl">Value:</span>
... <span id="04_content" class="content">90000 €</span>
... """
>>>
>>> soup = BeautifulSoup(html)
>>> span_id_prefixes = [
... span['id'].replace("_content","")
... for span in soup.findAll('span', attrs={'id' : re.compile(r'(_content$)')})
... ]
>>> for prefix in span_id_prefixes:
... lbl = soup.find('span', attrs={'id' : '%s_lbl' % prefix})
... content = soup.find('span', attrs={'id' : '%s_content' % prefix})
... if lbl and content:
... print lbl.text, content.text
...
Price: 130 €
Value: 90000 €
Price: 130 €
Value: 90000 €
>>来自bs4导入组
>>>进口稀土
>>>html=”“”
…价格:
... 130 €
…价值:
... 90000 €
...
...
…价格:
... 130 €
…价值:
... 90000 €
... """
>>>
>>>soup=BeautifulSoup(html)
>>>span\u id\u前缀=[
…span['id']。替换(“\u content”,”)
…对于soup.findAll中的span('span',attrs={'id':re.compile(r'(_content$)')})
... ]
>>>对于span\u id\u前缀中的前缀:
... lbl=soup.find('span',attrs={'id':'%s\u lbl'%prefix})
... content=soup.find('span',attrs={'id':'%s_content'%prefix})
... 如果是lbl和内容:
... 打印lbl.text、content.text
...
价格:130欧元
价值:90000欧元
价格:130欧元
价值:90000欧元
一个findAll
解决方案怎么样?
首先收集所有可能的id前缀,然后迭代它们并获取所有元素
>>> from bs4 import BeautifulSoup
>>> import re
>>> html = """
... <span id="07_lbl" class="lbl">Price:</span>
... <span id="07_content" class="content">130 €</span>
... <span id="08_lbl" class="lbl">Value:</span>
... <span id="08_content" class="content">90000 €</span>
...
...
... <span id="03_lbl" class="lbl">Price:</span>
... <span id="03_content" class="content">130 €</span>
... <span id="04_lbl" class="lbl">Value:</span>
... <span id="04_content" class="content">90000 €</span>
... """
>>>
>>> soup = BeautifulSoup(html)
>>> span_id_prefixes = [
... span['id'].replace("_content","")
... for span in soup.findAll('span', attrs={'id' : re.compile(r'(_content$)')})
... ]
>>> for prefix in span_id_prefixes:
... lbl = soup.find('span', attrs={'id' : '%s_lbl' % prefix})
... content = soup.find('span', attrs={'id' : '%s_content' % prefix})
... if lbl and content:
... print lbl.text, content.text
...
Price: 130 €
Value: 90000 €
Price: 130 €
Value: 90000 €
>>来自bs4导入组
>>>进口稀土
>>>html=”“”
…价格:
... 130 €
…价值:
... 90000 €
...
...
…价格:
... 130 €
…价值:
... 90000 €
... """
>>>
>>>soup=BeautifulSoup(html)
>>>span\u id\u前缀=[
…span['id']。替换(“\u content”,”)
…对于soup.findAll中的span('span',attrs={'id':re.compile(r'(_content$)')})
... ]
>>>对于span\u id\u前缀中的前缀:
... lbl=soup.find('span',attrs={'id':'%s\u lbl'%prefix})
... content=soup.find('span',attrs={'id':'%s_content'%prefix})
... 如果是lbl和内容:
... 打印lbl.text、content.text
...
价格:130欧元
价值:90000欧元
价格:130欧元
价值:90000欧元
以下是您如何轻松提取原始帖子中所想的价格值
html = """
<span id="07_lbl" class="lbl">Price:</span>
<span id="07_content" class="content">130 €</span>
<span id="08_lbl" class="lbl">Value:</span>
<span id="08_content" class="content">90000 €</span>
<span id="03_lbl" class="lbl">Price:</span>
<span id="03_content" class="content">130 €</span>
<span id="04_lbl" class="lbl">Value:</span>
<span id="04_content" class="content">90000 €</span>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
price_texts = soup.find_all('span', text='Price:')
for element in price_texts:
# .next_sibling() might work, too, with a parent element present
price_value = element.find_next_sibling('span')
print price_value.get_text()
# It prints:
# 130 €
# 130 €
html=”“”
价格:
130 €
价值:
90000 €
价格:
130 €
价值:
90000 €
"""
从bs4导入BeautifulSoup
soup=BeautifulSoup(html)
price_text=soup.find_all('span',text='price:'))
对于价格文本中的元素:
#.next_sibling()也可以在存在父元素的情况下工作
price\u value=element.find\u next\u sibling('span'))
打印价格\值。获取\文本()
#它打印:
# 130 €
# 130 €
这个解决方案的代码更少,而且在我看来更清晰。以下是您如何轻松地提取原始帖子中所想的价格值
html = """
<span id="07_lbl" class="lbl">Price:</span>
<span id="07_content" class="content">130 €</span>
<span id="08_lbl" class="lbl">Value:</span>
<span id="08_content" class="content">90000 €</span>
<span id="03_lbl" class="lbl">Price:</span>
<span id="03_content" class="content">130 €</span>
<span id="04_lbl" class="lbl">Value:</span>
<span id="04_content" class="content">90000 €</span>
"""
from bs4 import BeautifulSoup
soup = BeautifulSoup(html)
price_texts = soup.find_all('span', text='Price:')
for element in price_texts:
# .next_sibling() might work, too, with a parent element present
price_value = element.find_next_sibling('span')
print price_value.get_text()
# It prints:
# 130 €
# 130 €
html=”“”
价格:
130 €
价值:
90000 €
价格:
130 €
价值:
90000 €
"""
从bs4导入BeautifulSoup
soup=BeautifulSoup(html)
price_text=soup.find_all('span',text='price:'))
对于价格文本中的元素:
#.next_sibling()也可以在存在父元素的情况下工作
price\u value=element.find\u next\u sibling('span'))
打印价格\值。获取\文本()
#它打印:
# 130 €
# 130 €
此解决方案的代码更少,而且更清晰。为什么不在第二个示例中也使用130?我认为使用beautifulsoup为数百个站点编写这样一个通用的爬虫程序将非常困难。您想只提取价格还是同时提取价格和价值的内容?到目前为止,建议的答案对这两个问题都进行了摘录。在第二个例子2中是130欧元。是我的错。我只需要价格,我对“价值”一点也不感兴趣。为什么不在第二个示例中使用130呢?我认为使用beautifulsoup为数百个站点编写这样一个通用的爬虫程序将非常困难。您想只提取价格还是同时提取价格和价值的内容?到目前为止,建议的答案对这两个问题都进行了摘录。在第二个例子2中是130欧元。是我的错。我只需要价格,我对“价值”一点也不感兴趣。如果我这样做,我如何选择价格?我得到一个不同编号的列表,但无法确定价格是哪一个。如果我这样做,我如何选择价格?我得到一个不同编号的列表,但无法确定价格是哪一个。如果我这样做,我如何选择价格?我得到了一个不同编号的列表,但无法确定价格是哪一个。看我上次编辑的,我想我已经很好地理解了你的评论。非常感谢,这比我想象的要好得多。如果我这样做,我如何选择价格?我得到了一个不同编号的列表,但无法确定价格是哪一个。看我上次编辑的,我想我已经很好地理解了你的评论。非常感谢,这比我想象的要好得多。谢谢,非常感谢!谢谢你,非常感谢!