为了账号安全,请及时绑定邮箱和手机立即绑定

使用 BeautifulSoup 提取重复标签中的特定文本

使用 BeautifulSoup 提取重复标签中的特定文本

吃鸡游戏 2021-11-02 20:22:33
直接和狭隘的问题是subprocess.call()返回退出状态(0如果grep没有失败,或者失败1了),而不是输出。这可以通过使用check_output()来解决:version = subprocess.check_output(    "ansible --version | awk '/ansible [0-9].[0-9].[0-9]/ { print $2; exit }'", shell=True).strip().decode('utf-8')如果您想避免shell=True(值得称赞,但在您当前的用例中实际上并不是直接的安全问题),这可能如下所示:import reav = subprocess.check_output(['ansible', '--version'])match = re.match('^ansible (\d+[.]\d+[.]\d+)$', av.split(b'\n')[0].decode('utf-8'))if match is None:  raise Exception("Unable to get version number from ansible")version = match.group(1)如何使用 BeautifulSoup 将描述文本与这些标签中的文本隔离开来?到目前为止,我在 StackOverFlow 上发现的所有内容都表明它可能是可行的;但是我还没有找到专门尝试这样做的东西。同样,从源代码中,我只想提取描述“施洗约翰为耶稣施洗……”。我怎么能去做这件事?谢谢!再次为我缺乏扎实的知识而感到抱歉。
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

在这个例子中,我们可以使用 CSS 选择器。假设你使用的是 BeautifulSoup 4.7+,CSS 选择器支持是由Soupsieve库提供的。我们将首先使用:has()CSS 级别 4 选择器来查找<p>具有直接子<b>标签的标签,然后使用汤筛的非标准:contains选择器来确保<b>标签包含Description:. 然后我们简单地打印所有符合此条件的元素的内容,去除前导和尾随空格并去除Description:. 请记住,有多种方法可以做到这一点,这就是我选择来说明方法:


import bs4


markup = """

</div>

<div class="col-sm-6">

<P>

    <b>Book Title:</b>

    <A HREF="book_detail.cfm?ID=2449">The Holy Bible containing the Old and New Testaments, according to the authorised version. With illustrations by Gustave Doré</a>

</p>



    <P>

        <b>Author:</b> Doré, Gustave, 1832-1883

    </p>


    <P>

        <b>Image Title:</b> Baptism of Jesus

    </p>


    <P>

        <b>Scripture Reference:</b><ul><li>John 1 (<a href='search.cfm?biblicalbook=John&biblicalbookchapter=1'>further images</a> / <a rel='shadowbox;height=500;width=600' href='http://www.commonenglishbible.com/explore/passage-lookup/?query=John+1'>scripture text</a>)</li></ul>

    </p>


        <P>

            <b>Description:</b> John the Baptist baptizes Jesus in the Jordan River; the Holy Spirit appears overhead in the form of a dove. The artist, Gustave Doré (1832-1883), has placed his signature at the lower left of the woodcut, and the engraver’s signature, A. Ligny, is located at the lower right.

        </P>



    <P>

        <A HREF="book_list.cfm?ID=2449">Click here

        </a> for additional images available from this book.

    </P>


    <p>For information on licensing this image, please send an email, including a link to the image, to 

        <a href="mailto:dia@emory.edu?subject=Licensing%20Image%20From%20DIA - 17250">dia@emory.edu</a>

    </p>



</div>

"""


soup = bs4.BeautifulSoup(markup, "html.parser")


for el in soup.select('p:has(> b:contains("Description:"))'):

    print(el.get_text().strip('').replace('Description: ', ''))

输出:


John the Baptist baptizes Jesus in the Jordan River; the Holy Spirit appears overhead in the form of a dove. The artist, Gustave Doré (1832-1883), has placed his signature at the lower left of the woodcut, and the engraver’s signature, A. Ligny, is located at the lower right. 



查看完整回答
反对 回复 2021-11-02
?
幕布斯6054654

TA贡献1876条经验 获得超7个赞

我可以使用以下代码实现几乎像您想要的东西:


import urllib.request

import urllib.parse

from bs4 import BeautifulSoup


url = "http://pitts.emory.edu/dia/image_details.cfm?ID=17250"

f = urllib.request.urlopen(url)


soup = BeautifulSoup(f, 'html.parser')

parent = soup.find("b", text="Description:").parent

parent.find("b", text="Description:").decompose()

print(parent.text)

我添加了 BeautifulSoup 并删除了描述。


查看完整回答
反对 回复 2021-11-02
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

我使用 < p > 标签作为索引,然后选择了 [4] 索引。我只是一个新手,但它奏效了。


from urllib.request import urlopen

from bs4 import BeautifulSoup


html = urlopen("http://pitts.emory.edu/dia/image_details.cfm?ID=17250")


soup = BeautifulSoup(html, 'html.parser')

page = soup.find_all('p')[4].getText()


print(page)


查看完整回答
反对 回复 2021-11-02
  • 3 回答
  • 0 关注
  • 281 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信