使用Python中的BeautifulSoup刻录带有下标的文本

时间:2016-03-15 22:20:24

标签: python web-scraping beautifulsoup

一切!我正在制作我的第一个网络刮刀,当给出“CitedBy”页面like this

时,它会从PMC获取作者姓名,URL和纸质名称。

我的程序可以很好地获取作者姓名和URL,但是我只能得到一些论文题目,我怀疑是由于下标和上标。

这是我到目前为止所得到的:

    import requests
    from bs4 import BeautifulSoup
    import re

    url = 'http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2593677/citedby/?page=0'
    req = requests.get(url)
    plain_text = req.text
    soup = BeautifulSoup(plain_text, "lxml") #soup object

    titles_list = []

    for items in soup.findAll('div', {'class': 'title'}):
        title = items.string
        if title is None:
            title = ("UHOH") #Problems with some titles
        #print(title)
        titles_list.append(title)

当我运行这段代码时,我的刮刀给了我这些结果:

  1. 寻找和比较拟南芥和外群木瓜,杨树和葡萄的同步区域:CoGe与Rosids
  2. UHOH
  3. 控制结瘤过程的豆科植物基因的综合比较基因组和转录组学分析
  4. UHOH
  5. RPL9的剂量敏感性和植物核糖体蛋白基因的协同进化
  6. 等整个页面......

    本页的一些论文中我得到的是“UHOH”:

    • 比较细胞特异性转录组学揭示了柳枝稷和其他C4谱系中C4光合作用途径的分化
    • 从头构建的远距离球形朝鲜蓟的基因组序列包含F1子代的相位感知低通测序策略

    • 拟南芥和Medic藜苜蓿之间非生物应激反应基因的跨家系翻译基因组学

    我在此列出的前两个我认为是有问题的,因为“C4”和“F1”实际上是“C下标4”和“F下标1”。对于第三个,“Medicago truncatula”是一个“em”HTML标签,所以我怀疑这就是为什么我的刮刀不能刮掉它。

    我想到的唯一替代解决方案是让我的“soup.findAll”更具体,但这并没有最终帮助我。我试过了:

    for items in soup.findAll('div', {'class': 'title'}):
            title = items.string
            if title is None:
                for other in soup.findAll('a', {'class': 'view'}):
                    title = other.string
    

    但遗憾的是,这不起作用......所以我不确定如何处理这个问题。有谁知道如何处理这些特殊情况?非常感谢!

1 个答案:

答案 0 :(得分:1)

感谢@LukasGraf,我有答案!

由于我使用的是BeautifulSoup,我可以使用node.get_text()。它与普通的“.string”不同,因为它还返回标记下面的所有文本,这是下标和“em”HTML标记文本的情况。