dan*_*neu 23 python screen-scraping beautifulsoup
我的源代码如下:
<h3>Header3 (Start here)</h3>
<ul>
<li>List items</li>
<li>Etc...</li>
</ul>
<h3>Header 3</h3>
<ul>
<li>List items</li>
<ul>
<li>Nested list items</li>
<li>Nested list items</li></ul>
<li>List items</li>
</ul>
<h2>Header 2 (end here)</h2>
Run Code Online (Sandbox Code Playgroud)
我希望所有"li"标签跟在第一个"h3"标签之后,并停在下一个"h2"标签,包括所有嵌套的li标签.
firstH3 = soup.find('h3')
正确找到我想要开始的地方.
firstH3 = soup.find('h3') # Start here
uls = []
for nextSibling in firstH3.findNextSiblings():
if nextSibling.name == 'h2':
break
if nextSibling.name == 'ul':
uls.append(nextSibling)
Run Code Online (Sandbox Code Playgroud)
给我一个UL列表,每个都有我需要的LI内容.
摘录"uls"列表:
<ul>
...
<li><i><a href="/wiki/Agent_Cody_Banks" title="Agent Cody Banks">Agent Cody Banks</a></i> (2003)</li>
<li><i><a href="/wiki/Agent_Cody_Banks_2:_Destination_London" title="Agent Cody Banks 2: Destination London">Agent Cody Banks 2: Destination London</a></i> (2004)</li>
<li>Air Bud series:
<ul>
<li><i><a href="/wiki/Air_Bud:_World_Pup" title="Air Bud: World Pup">Air Bud: World Pup</a></i> (2000)</li>
<li><i><a href="/wiki/Air_Bud:_Seventh_Inning_Fetch" title="Air Bud: Seventh Inning Fetch">Air Bud: Seventh Inning Fetch</a></i> (2002)</li>
<li><i><a href="/wiki/Air_Bud:_Spikes_Back" title="Air Bud: Spikes Back">Air Bud: Spikes Back</a></i> (2003)</li>
<li><i><a href="/wiki/Air_Buddies" title="Air Buddies">Air Buddies</a></i> (2006)</li>
</ul>
</li>
<li><i><a href="/wiki/Akeelah_and_the_Bee" title="Akeelah and the Bee">Akeelah and the Bee</a></i> (2006)</li>
...
</ul>
Run Code Online (Sandbox Code Playgroud)
但我不确定从这里去哪里.我是一个新手程序员,试图通过构建一个擦除http://en.wikipedia.org/wiki/2000s_in_film并提取"电影标题(年份)"列表的脚本来跳转到Python .
更新:
最终守则:
lis = []
for ul in uls:
for li in ul.findAll('li'):
if li.find('ul'):
break
lis.append(li)
for li in lis:
print li.text.encode("utf-8")
Run Code Online (Sandbox Code Playgroud)
If - > break抛出包含UL的LI,因为嵌套的LI现在是重复的.
打印输出现在是:
- 102达尔马提亚人(2000)
- 10th&Wolf(2006)
- 11:14(2006)
- 12:08布加勒斯特东部(2006年)
- 13继续30(2004)
- 1408(2007)
- ...
谢谢
jfs*_*jfs 18
.findAll()适用于嵌套li元素:
for ul in uls:
for li in ul.findAll('li'):
print(li)
Run Code Online (Sandbox Code Playgroud)
输出:
<li>List items</li>
<li>Etc...</li>
<li>List items</li>
<li>Nested list items</li>
<li>Nested list items</li>
<li>List items</li>
Run Code Online (Sandbox Code Playgroud)
列表理解也可以起作用.
lis = [li for ul in uls for li in ul.findAll('li')]
Run Code Online (Sandbox Code Playgroud)