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