python-beautifulsoup-在标记之间查找可变数量的文本

python-beautifulsoup-在标记之间查找可变数量的文本,python,html,beautifulsoup,Python,Html,Beautifulsoup,我正在使用python+beautifulsoup解析html。我的问题是,我有一个可变数量的文本项目。例如,在本例中,我想提取'Text 1'、'Text 2'、…'案文4”。在其他网页中,可能只有“文本1”或可能有两个,等等,所以它会发生变化。如果“文本x”包含在一个标签中,它会让我的生活更轻松。但事实并非如此。我可以使用next和previous(或者nextSibling和previousSibling)访问它们,但我不知道如何获取它们。这个想法是(假设我遇到的最大数字是4)将“文本1”

我正在使用python+beautifulsoup解析html。我的问题是,我有一个可变数量的文本项目。例如,在本例中,我想提取'Text 1'、'Text 2'、…'案文4”。在其他网页中,可能只有“文本1”或可能有两个,等等,所以它会发生变化。如果“文本x”包含在一个标签中,它会让我的生活更轻松。但事实并非如此。我可以使用next和previous(或者nextSibling和previousSibling)访问它们,但我不知道如何获取它们。这个想法是(假设我遇到的最大数字是4)将“文本1”写入一个文件,然后一直写到“文本4”。在这种情况下就是这样。在只有“文本1”的情况下,我会将“文本1”写入文件,然后只为2-4保留空格。对我应该做什么有什么建议吗

<div id="DIVID" style="display: block; margin-left: 1em;">
  <b>Header 1</b>
  <br/>
  Text 1
  <br/>
  Text 2
  <br/>
  Text 3
  <br/>
  Text 4
 <br/>
 <b>Header 2</b>
</div>

标题1

文本1
文本2
文本3
文本4
标题2
当我这么做的时候,我有一个不太相关的问题。假设我有一个网站,有一个可变数量的链接,所有链接到html完全一样,我上面有。这不是这个应用程序,但想想craigslist——在一个中心页面上有很多链接。我需要能够访问这些页面中的每一个,以便进行解析。这样做的好方法是什么

谢谢

额外: 下一个网页可能如下所示:

<div id="DIVID2" style="display: block; margin-left: 1em;">
  <b>Header 1</b>
  <br/>
  Different Text 1
  <br/>
  Different Text 2
 <br/>
 <b>Header 2</b>
</div>
>>> test ="""<b>Header 1</b>
<br/>
Text 1
<br/>
Text 2
<br/>
Text 3
<br/>
Text 4
<br/>
<b>Header 2</b>"""
>>> soup = BeautifulSoup(test)

>>> test = soup.find('b')
>>> desired_text = [x.strip() for x in str(test.parent).split('<br />')]
['<b>Header 1</b>', 'Text 1', 'Text 2', 'Text 3', 'Text 4', '<b>Header 2</b>']
some_list = [item for item in some_iterable]

标题1

不同文本1
不同文本2
标题2
请注意区别:

  • DIVID现在是DIVID2。我可以根据页面上的其他解析计算出DIVID的结尾。这不是问题

  • 我只有两条文本,而不是四条

  • 现在的文本不同了

  • 请注意关键的相似性:

  • 收割台1和收割台2相同。这些不会改变

  • 您可以尝试以下方法:

    <div id="DIVID2" style="display: block; margin-left: 1em;">
      <b>Header 1</b>
      <br/>
      Different Text 1
      <br/>
      Different Text 2
     <br/>
     <b>Header 2</b>
    </div>
    
    >>> test ="""<b>Header 1</b>
    <br/>
    Text 1
    <br/>
    Text 2
    <br/>
    Text 3
    <br/>
    Text 4
    <br/>
    <b>Header 2</b>"""
    >>> soup = BeautifulSoup(test)
    
    >>> test = soup.find('b')
    >>> desired_text = [x.strip() for x in str(test.parent).split('<br />')]
    ['<b>Header 1</b>', 'Text 1', 'Text 2', 'Text 3', 'Text 4', '<b>Header 2</b>']
    
    some_list = [item for item in some_iterable]
    

    这只会生成一个从“some_iterable”中提取的“item”列表。在我的列表理解中,我正在浏览列表,获取列表中的每一项,然后简单地去掉一个换行符(
    x.strip()
    部分)。顺便说一下,有很多方法可以做到这一点

    您可以尝试以下方法:

    <div id="DIVID2" style="display: block; margin-left: 1em;">
      <b>Header 1</b>
      <br/>
      Different Text 1
      <br/>
      Different Text 2
     <br/>
     <b>Header 2</b>
    </div>
    
    >>> test ="""<b>Header 1</b>
    <br/>
    Text 1
    <br/>
    Text 2
    <br/>
    Text 3
    <br/>
    Text 4
    <br/>
    <b>Header 2</b>"""
    >>> soup = BeautifulSoup(test)
    
    >>> test = soup.find('b')
    >>> desired_text = [x.strip() for x in str(test.parent).split('<br />')]
    ['<b>Header 1</b>', 'Text 1', 'Text 2', 'Text 3', 'Text 4', '<b>Header 2</b>']
    
    some_list = [item for item in some_iterable]
    

    这只会生成一个从“some_iterable”中提取的“item”列表。在我的列表理解中,我正在浏览列表,获取列表中的每一项,然后简单地去掉一个换行符(
    x.strip()
    部分)。顺便说一下,有很多方法可以做到这一点

    这里有一个不同的解决方案。nextSibling可以获取结构化文档中跟随命名标记的部分

    from BeautifulSoup import BeautifulSoup
    
    text="""
    <b>Header 1</b>
    <br/>
    Text 1
    <br/>
    Text 2
    <br/>
    Text 3
    <br/>
    Text 4
    <br/>
    <b>Header 2</b>
    """
    
    soup = BeautifulSoup(text)
    
    for br in soup.findAll('br'):
        following = br.nextSibling
        print following.strip()
    
    从美化组导入美化组
    text=”“”
    标题1
    
    文本1
    文本2
    文本3
    文本4
    标题2 """ soup=BeautifulSoup(文本) 对于汤中的br.findAll('br'): following=br.nextSibling 打印下面的.strip()
    这里有一个不同的解决方案。nextSibling可以获取结构化文档中跟随命名标记的部分

    from BeautifulSoup import BeautifulSoup
    
    text="""
    <b>Header 1</b>
    <br/>
    Text 1
    <br/>
    Text 2
    <br/>
    Text 3
    <br/>
    Text 4
    <br/>
    <b>Header 2</b>
    """
    
    soup = BeautifulSoup(text)
    
    for br in soup.findAll('br'):
        following = br.nextSibling
        print following.strip()
    
    从美化组导入美化组
    text=”“”
    标题1
    
    文本1
    文本2
    文本3
    文本4
    标题2 """ soup=BeautifulSoup(文本) 对于汤中的br.findAll('br'): following=br.nextSibling 打印下面的.strip()
    您可以使用
    get\u text
    组合所有内容:

    test ="""<div id='DIVID'>
    <b>Header 1</b>
    <br/>
    Text 1
    <br/>
    Text 2
    <br/>
    Text 3
    <br/>
    Text 4
    <br/>
    <b>Header 2</b>
    </div>"""
    
    def divid(tag):
        return tag.name=='div' and tag.has_attr('id') and tag['id'].startswith('DIVID')
    
    soup = BeautifulSoup(test)
    print soup.find(divid).get_text()
    
    test=”“”
    标题1
    
    文本1
    文本2
    文本3
    文本4
    标题2 """ def divid(标签): return tag.name=='div'和tag.has_attr('id')和tag['id']。startswith('DIVID')) 汤=美汤(测试) 打印soup.find(divid.get_text())
    这会给你

    Header 1 Text 1 Text 2 Text 3 Text 4 Header 2 标题1 文本1 文本2 文本3 文本4 标题2
    您可以使用
    get\u text
    组合所有内容:

    test ="""<div id='DIVID'>
    <b>Header 1</b>
    <br/>
    Text 1
    <br/>
    Text 2
    <br/>
    Text 3
    <br/>
    Text 4
    <br/>
    <b>Header 2</b>
    </div>"""
    
    def divid(tag):
        return tag.name=='div' and tag.has_attr('id') and tag['id'].startswith('DIVID')
    
    soup = BeautifulSoup(test)
    print soup.find(divid).get_text()
    
    test=”“”
    标题1
    
    文本1
    文本2
    文本3
    文本4
    标题2 """ def divid(标签): return tag.name=='div'和tag.has_attr('id')和tag['id']。startswith('DIVID')) 汤=美汤(测试) 打印soup.find(divid.get_text())
    这会给你

    Header 1 Text 1 Text 2 Text 3 Text 4 Header 2 标题1 文本1 文本2 文本3 文本4 标题2
    谢谢你的回答。是的,此代码全部包含在。假设这将被视为“父”标记。你能解释一下你的最后一行代码吗?我是python新手,我不知道这应该做什么。此外,每页的“文本1”等各不相同。我认为这可能是一个问题。如果
    div
    标签有相关的css选择器(ID和/或类),那么这可能是一个更好的方式,可以直接进入您想要的内容。是的,它看起来是这样的:现在要做什么?另外,我应该提到,虽然“文本x”有所不同,“Header 1”和“Header 2”没有。你能编辑你的文章并包括更广泛的html块,包括完整的父div标记吗?谢谢你的回答。是的,此代码全部包含在。假设这将被视为“父”标记。你能解释一下你的最后一行代码吗?我是python新手,我不知道这应该做什么。此外,每页的“文本1”等各不相同。我认为这可能是一个问题。如果
    div
    标签有相关的css选择器(ID和/或类),那么这可能是一个更好的方式,可以直接进入您想要的内容。是的,它看起来是这样的:现在要做什么?另外,我应该提到,虽然“文本x”有所不同,“Header 1”和“Header 2”没有。你能编辑你的文章并包含更广泛的html块,包括完整的父div标记吗?