2017-07-18 5 views
0

オンラインブックマークサービスで自分のアカウントからデータをスクラップしようとしています。ブックマークのあるページは、次のように構成されています。Python Web Scraping:複数のタグを持つ1つの属性を抽出します。

<!DOCTYPE html> 
<html lang="en"> 
<body> 
<div id="item1" class="outer_block"> 
    <div class="title">Bookmark 1</div> 
    <div class="link"> 
     <a href="https://bookmark1.com">https://bookmark1.com</a> 
    </div> 
    <div class="tags"> 
     <a href="http://mylink.com/tag1">tag1</a> 
     <a href="http://mylink.com/tag2">tag2</a> 
    </div> 
</div> 
<div id="item2" class="outer_block"> 
    <div class="title">Bookmark 2</div> 
    <div class="link"> 
     <a href="https://bookmark2.com">https://bookmark2.com</a> 
    </div> 
    <div class="tags"> 
     <a href="http://mylink.com/tag1">tag1</a> 
    </div> 
</div> 
<div id="item3" class="outer_block"> 
    <div class="title">Bookmark 3</div> 
    <div class="link"> 
     <a href="https://bookmark3.com">https://bookmark3.com</a> 
    </div> 
    <div class="tags"> 
     <a href="http://mylink.com/tag3">tag3</a> 
    </div> 
</div> 
</body> 
</html> 

各ブロックについて、タイトル、リンク、タグを抽出したいと思います。 のPython 3.5では、私が行います

# Import modules 
import requests 
from lxml import html 

# Read the html 
# url = 'mylink' 
# page = requests.get(url) 
# tree = html.fromstring(page.content) 
# This is the replicable example 
tree = html.fromstring('<!DOCTYPE html><html lang="en"><body><div id="item1" class="outer_block"> <div class="title">Item 1</div> <div class="link"> <a href="https://bookmark1.com">https://bookmark1.com</a> </div> <div class="tags"> <a href="http://mylink.com/tag1">tag1</a> <a href="http://mylink.com/tag2">tag2</a> </div></div><div id="item2" class="outer_block"> <div class="title">Item 2</div> <div class="link"> <a href="https://bookmark2.com">https://bookmark2.com</a> </div> <div class="tags"> <a href="http://mylink.com/tag1">tag1</a> </div></div><div id="item3" class="outer_block"> <div class="title">Item 3</div> <div class="link"> <a href="https://bookmark3.com">https://bookmark3.com</a> </div> <div class="tags"> <a href="http://mylink.com/tag3">tag3</a> </div></div></body></html>') 

は、私は、文字列のパターンを抽出するためにxpathを使用し、言うタイトル:

titles = tree.xpath('//div[@class="title"]/text()') 
print(titles) 

[ 'ブックマーク1'、 'ブックマーク2'、 'ブックマーク3'

tags = tree.xpath('//div[@class="tags"]//a/text()') 
print(tags) 

[」:]

は、タグを抽出するために、私は、同じ原理を使用します

問題は各リンクにさまざまなタグがあるため、配列titlesと配列tagsを関連付けることができないということです。 私は、各ブロックを抽出して、別々に仕事ができると思った:私は理解していないが、私はblock1からタグを抽出するとき、それはまだ元のHTMLのタグのすべてを維持することである

blocks = tree.xpath('//div[@class="outer_block"]') 
block1 = blocks[0] 

tags_block1 = block1.xpath('//div[@class="tags"]//a/text()' 
print(tags_block1) 

最高出力フォーマットであり、そこに他の何であるか[「タグ1」、「TAG2」、「TAG1」、「TAG3」]私はタイトルと対応するタグを抽出するにはどうすればよい

、より簡単に仕事をすることができるパッケージ?

答えて

1

BeautifulSoupの使用について考える必要があります。 (ソースは、HTMLの文字列である)以下のコードを検討:

from bs4 import BeautifulSoup 

soup = BeautifulSoup(source, "html.parser") 
outer_blocks = soup.find_all("div", class_="outer_block") 

for block in outer_blocks: 
    title = block.find("div", class_="title").contents[0] 
    link = block.find("a").contents[0] 
    tags = [x.contents[0] for x in block.find("div", class_="tags").find_all("a")] 
    print([title, link, tags]) 

出力である:

['Bookmark 1', 'https://bookmark1.com', ['tag1', 'tag2']] 
['Bookmark 2', 'https://bookmark2.com', ['tag1']] 
['Bookmark 3', 'https://bookmark3.com', ['tag3']] 
関連する問題