01/10/2018, 09:08

Làm sao để lấy được các text trong và ngoài thẻ a đây hả các bác

<H3>
     <A NAME="abby_siger">Abby Singer</A>
</H3>
"The second-to-last"
<A HREF="/glossary/S#shot">shot</A>
"of the day. Named after"
<A HREF="/glossary/P#prod_manager">production manager</A> 
<A HREF="/Name?Singer,+Abby">Abby Singer</A>
", who would frequently call "last shot of the day" or "this shot, and just one more," only to have the"
<A HREF="/glossary/D#director">director</A>
 "ask for more"
<A HREF="/glossary/T#take">take</A>
"s. See also "
<A HREF="/glossary/M#martini_shot">martini shot</A>
"."
<HR NOSHADE WIDTH="40%">
NG viết 11:24 ngày 01/10/2018

bác sử dụng module re nhé

https://docs.python.org/3/library/re.html

sao bác edit, em tưởng đó lá string

NG viết 11:14 ngày 01/10/2018

Bác nói rõ chút đi, bác load dữ liệu từ file, string, hay gì gì.

Mình gỉa dụ là load từ file html nhé. Bạn cứ đọc file với io.open, chuyển nó thành string, sau đó dùng module re mà bụp thôi.

Lưu Đức Hòa viết 11:12 ngày 01/10/2018

add face hay mail gì để dễ trao đổi được không bác

Lưu Đức Hòa viết 11:15 ngày 01/10/2018

tui load từ trang imdb.com/glossary/A muốn lấy các text ví dụ như “The second-to-last” thì làm sao bác

NG viết 11:14 ngày 01/10/2018

vậy bác dùng module requests đi.
http://docs.python-requests.org/en/master/

bác tìm cái request trả lại cái response có data mà bác muốn, xong chuyển cái data đó qua string, vẫn cách cũ, dùng re mà cắt thôi.
Trường hợp response của server là Json thì dễ nữa, cứ xài module json rồi chiến thôi

Thành Phạm viết 11:15 ngày 01/10/2018

Bạn dùng cái này thử xem, requests + beautifulsoup là đẹp rồi đấy

https://www.crummy.com/software/BeautifulSoup/bs4/doc/

http://docs.python-requests.org/en/master/

demo:

NG viết 11:24 ngày 01/10/2018
from bs4 import BeautifulSoup
import requests
import json

def list_glossary(word):
	response = requests.get("http://www.imdb.com/glossary/"+word)
	html_doc = response.text
	list_gl = ['<H3>' + e for e in html_doc.split('<H3>')]
	list_gl[list_gl.__len__()-1] = list_gl[list_gl.__len__()-1].split('<HR NOSHADE')[0] 
	list_result = []
	for gl in list_gl[1:]:
		soup = BeautifulSoup(gl, 'html.parser')
		key_gl = soup.contents[0].string
		desc = u''
		for elt in soup.contents[1:]:
			desc += elt.text

		list_result.append({key_gl:desc})
	return list_result
	
list_key = ['A', 'B', 'C']
dict_gl = {}
for k in list_key:
	dict_gl[k] = list_glossary(k)

datajson = json.dumps(dict_gl)
with open('json_glossary','w') as f:
	f.write(datajson)
Lưu Đức Hòa viết 11:13 ngày 01/10/2018

có bác nào giải thích giùm e đoạn code này được không ạ

list_gl = ['<H3>' + e for e in html_doc.split('<H3>')]

Lưu Đức Hòa viết 11:20 ngày 01/10/2018

Mong cao nhân nào giải thích giùm e

list_gl = [’<H3>’ + e for e in html_doc.split(’<H3>’)]

Thành Phạm viết 11:11 ngày 01/10/2018

Nghĩa là cắt html_hoc ra theo cụm kí tự <H3> tạo là 1 list, xong cộng thêm mỗi phần tử một cụm kí tự <H3> ở đầu

html_doc mà là a<H3>b<H3>c thì html_doc.split('<H3>') là ['a', 'b', 'c']

code này là code kiểu gọn, hay gọi là list comprehension

Viết dài thì như này

list_gl = []
for e in html_doc.split('<H3>'):
    list_gl.append(e+'<H3>')
NG viết 11:18 ngày 01/10/2018

Trong BeautifulSoup.get_text() làm sao đổi thẻ <BR> thành ‘\n’ vậy lead.
soup =

<h>
    <a>
        Text 1
    </a>
    <br>
    Text 2
<h>
print(soup.get_text())

Text 1Text2

thay vì phải là
Text 1
Text 2

NG viết 11:21 ngày 01/10/2018

Tạm thời mình dùng

html_doc = html_doc.replace('<BR>', '\n')

trước khi gọi BeautifulSoup, nhưng mình muốn hỏi có cách nào xử lý trực tiếp trên soup không ?

Thành Phạm viết 11:21 ngày 01/10/2018

Mình không biết nữa chắc chỉ còn cách đó thôi hay b thích dùng cái code kiểu này, thay extract bằng replace là được

stackoverflow.com
TerryA

Beautifulsoup sibling structure with br tags

python, beautifulsoup
answered by TerryA on 12:00PM - 14 Jul 13
NG viết 11:24 ngày 01/10/2018

extract() chỉ là gỡ cái tag đó ra thôi, không có thay bằng xuống hàng.
Nếu xài ‘lxml’ còn đỡ, chỉ thay <br> thành <br/> nên có gỡ cũng không mất text. Thảm họa nhất là khi dùng ‘html.parser’, nó tự thêm </br> vào cuối text, khi đó remove thẻ đó ra là mất text trong soup luôn.
ext = soup.br.extract()
soup mất toàn bộ text trong thẻ <br>
ext lẻ loi ko biết đút vào đâu

Xem docs bs4 thì thấy cái replace_with(), tương tụ replace.

Tạm thời report cho bác thế.

Bài liên quan
0