Python beautifulsoup无标识符提取值

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 =

我正面临一个问题,不知道如何妥善解决它。 我想提取价格(在第一个例子中是130欧元,在第二个例子中是130欧元)

问题是属性一直在变化。所以我不能这样做,因为我正在抓取数百个站点,每个站点上“id”属性的前2个字符可能不同:

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以_content

Try函数结尾。它使用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欧元。是我的错。我只需要价格,我对“价值”一点也不感兴趣。如果我这样做,我如何选择价格?我得到一个不同编号的列表,但无法确定价格是哪一个。如果我这样做,我如何选择价格?我得到一个不同编号的列表,但无法确定价格是哪一个。如果我这样做,我如何选择价格?我得到了一个不同编号的列表,但无法确定价格是哪一个。看我上次编辑的,我想我已经很好地理解了你的评论。非常感谢,这比我想象的要好得多。如果我这样做,我如何选择价格?我得到了一个不同编号的列表,但无法确定价格是哪一个。看我上次编辑的,我想我已经很好地理解了你的评论。非常感谢,这比我想象的要好得多。谢谢,非常感谢!谢谢你,非常感谢!