使用python soup在动态HTML标记之间提取文本

时间:2016-12-26 11:46:58

标签: python-3.x beautifulsoup

我有一个要求,我需要在HTML标记之间提取文本。我使用BeautifulSoup来提取数据并将文本存储到变量中以供进一步处理。后来我发现,我需要提取的文本有两个不同的标签。但请注意,我需要提取文本并存储到同一个变量中。我提供了我之前的代码和示例HTML文本信息。请帮助我如何得到我的最终结果,即预期的输出。

示例HTML文本:

<DIV CLASS="c0"><P CLASS="c1"><SPAN CLASS="c2">1 of 80 DOCUMENTS</SPAN></P>
<DIV CLASS="c0"><BR><P CLASS="c1"><SPAN CLASS="c2">Financial Times (London, England)</SPAN></P>
<DIV CLASS="c0"><BR><P CLASS="c1"><SPAN CLASS="c2">Copyright 2015 The Financial Times Ltd.<BR>All Rights Reserved<BR>Please do not cut and paste FT articles and redistribute by email or post to the web.</SPAN></P>

<DIV CLASS="c0"><P CLASS="c1"><SPAN CLASS="c2">80 of 80 DOCUMENTS</SPAN></P>
</DIV>
<BR><DIV CLASS="c3"><P CLASS="c1"><SPAN CLASS="c2">Financial Times (London,England)</SPAN></P>
</DIV>
<DIV CLASS="c3"><P CLASS="c1"><SPAN CLASS="c2">Copyright 1990 The Financial Times Limited</SPAN></P>
</DIV>

从上面的HTML文本中,我需要将文档(80个文档中的1个,80个文档中的80个)存储到单个变量中。类似于其他文本,它遵循类似的方法。我为div.c0写了代码

        soup = BeautifulSoup(response, 'html.parser')
        docpublicationcpyright = soup.select('div.c0')

        list1 = [b.text.strip() for b in docpublicationcpyright]
        doccountvalues = list1[0:len(list1):3]
        publicationvalues = list1[1:len(list1):3]
        copyrightvalues = list1[2:len(list1):3]
        documentcount = doccountvalues

        publicationpaper = publicationvalues

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

给定示例HTML没有正确结构化。例如:第一个DIV元素缺少结束标记。无论如何,这种类型的HTML也使用正则表达式,你可以抓取所需的数据。

我编写了一个示例代码,仅考虑问题&amp;能够提取所有三个必填字段

   @Override
 public View getView(int position, View convertView, ViewGroup parent) {  
        if (convertView == null) {    
        if (isItemSelected.equals("true")){
listviewTitles.setBackgroundColor(0xAAAAFFFF);
          }
          else if (isItemSelected.equals("false")){
            // Default color    
          }
            }else{

         if (isItemSelected.equals("true")){

    listviewTitles.setBackgroundColor(0xAAAAFFFF);
           }
          else if (isItemSelected.equals("false")){
             // Default color    
          } 
        }

输出如下所示

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

documentElements = soup.find_all('span', text=re.compile(r'of [0-9]+ DOCUMENTS'))
documentCountList = []
publicationPaperList = []
documentPublicationCopyrightList = []
for elem in documentElements:
    documentCountList.append(elem.get_text().strip())
    if elem.parent.find_next_sibling('div'):
        publicationPaperList.append(elem.parent.find_next_sibling('div').find('span').get_text().strip())
        documentPublicationCopyrightList.append(elem.parent.find_next_sibling('div').find_all('span')[1].get_text())
    else:
        publicationPaperList.append(elem.parent.parent.find_next('div').get_text().strip())
        documentPublicationCopyrightList.append(elem.parent.parent.find_next('div').find_next('div').get_text().strip())

print(documentCountList)
print(publicationPaperList)
print(documentPublicationCopyrightList)